diff --git a/lapack-netlib/SRC/cgebrd.f b/lapack-netlib/SRC/cgebrd.f
index 5687161a50..5920b1cf58 100644
--- a/lapack-netlib/SRC/cgebrd.f
+++ b/lapack-netlib/SRC/cgebrd.f
@@ -123,7 +123,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of the array WORK. LWORK >= max(1,M,N).
+*> The length of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MAX(M,N), otherwise.
*> For optimum performance LWORK >= (M+N)*NB, where NB
*> is the optimal blocksize.
*>
@@ -148,7 +149,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complexGEcomputational
+*> \ingroup gebrd
*
*> \par Further Details:
* =====================
@@ -225,8 +226,8 @@ SUBROUTINE CGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
* ..
* .. Local Scalars ..
LOGICAL LQUERY
- INTEGER I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB,
- $ NBMIN, NX, WS
+ INTEGER I, IINFO, J, LDWRKX, LDWRKY, LWKMIN, LWKOPT,
+ $ MINMN, NB, NBMIN, NX, WS
* ..
* .. External Subroutines ..
EXTERNAL CGEBD2, CGEMM, CLABRD, XERBLA
@@ -236,16 +237,24 @@ SUBROUTINE CGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
* ..
* .. External Functions ..
INTEGER ILAENV
- EXTERNAL ILAENV
+ REAL SROUNDUP_LWORK
+ EXTERNAL ILAENV, SROUNDUP_LWORK
* ..
* .. Executable Statements ..
*
* Test the input parameters
*
INFO = 0
- NB = MAX( 1, ILAENV( 1, 'CGEBRD', ' ', M, N, -1, -1 ) )
- LWKOPT = ( M+N )*NB
- WORK( 1 ) = REAL( LWKOPT )
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWKMIN = 1
+ LWKOPT = 1
+ ELSE
+ LWKMIN = MAX( M, N )
+ NB = MAX( 1, ILAENV( 1, 'CGEBRD', ' ', M, N, -1, -1 ) )
+ LWKOPT = ( M+N )*NB
+ END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -253,7 +262,7 @@ SUBROUTINE CGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
INFO = -2
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, M, N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -10
END IF
IF( INFO.LT.0 ) THEN
@@ -265,7 +274,6 @@ SUBROUTINE CGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
*
* Quick return if possible
*
- MINMN = MIN( M, N )
IF( MINMN.EQ.0 ) THEN
WORK( 1 ) = 1
RETURN
@@ -284,7 +292,7 @@ SUBROUTINE CGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
* Determine when to switch from blocked to unblocked code.
*
IF( NX.LT.MINMN ) THEN
- WS = ( M+N )*NB
+ WS = LWKOPT
IF( LWORK.LT.WS ) THEN
*
* Not enough work space for the optimal NB, consider using
@@ -343,7 +351,7 @@ SUBROUTINE CGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
*
CALL CGEBD2( M-I+1, N-I+1, A( I, I ), LDA, D( I ), E( I ),
$ TAUQ( I ), TAUP( I ), WORK, IINFO )
- WORK( 1 ) = WS
+ WORK( 1 ) = SROUNDUP_LWORK( WS )
RETURN
*
* End of CGEBRD
diff --git a/lapack-netlib/SRC/cgehrd.f b/lapack-netlib/SRC/cgehrd.f
index f407f931a9..7ba87cc01b 100644
--- a/lapack-netlib/SRC/cgehrd.f
+++ b/lapack-netlib/SRC/cgehrd.f
@@ -89,7 +89,7 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX array, dimension (LWORK)
+*> WORK is COMPLEX array, dimension (MAX(1,LWORK))
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
@@ -222,13 +222,19 @@ SUBROUTINE CGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
INFO = -8
END IF
*
+ NH = IHI - ILO + 1
IF( INFO.EQ.0 ) THEN
*
* Compute the workspace requirements
*
- NB = MIN( NBMAX, ILAENV( 1, 'CGEHRD', ' ', N, ILO, IHI, -1 ) )
- LWKOPT = N*NB + TSIZE
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ IF( NH.LE.1 ) THEN
+ LWKOPT = 1
+ ELSE
+ NB = MIN( NBMAX, ILAENV( 1, 'DGEHRD', ' ', N, ILO, IHI,
+ $ -1 ) )
+ LWKOPT = N*NB + TSIZE
+ END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -249,7 +255,6 @@ SUBROUTINE CGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
*
* Quick return if possible
*
- NH = IHI - ILO + 1
IF( NH.LE.1 ) THEN
WORK( 1 ) = 1
RETURN
@@ -269,7 +274,7 @@ SUBROUTINE CGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
*
* Determine if workspace is large enough for blocked code
*
- IF( LWORK.LT.N*NB+TSIZE ) THEN
+ IF( LWORK.LT.LWKOPT ) THEN
*
* Not enough workspace to use optimal NB: determine the
* minimum value of NB, and reduce NB or force use of
@@ -345,7 +350,8 @@ SUBROUTINE CGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
* Use unblocked code to reduce the rest of the matrix
*
CALL CGEHD2( N, I, IHI, A, LDA, TAU, WORK, IINFO )
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+*
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/cgelq.f b/lapack-netlib/SRC/cgelq.f
index ff482bc42e..24aaa982e3 100644
--- a/lapack-netlib/SRC/cgelq.f
+++ b/lapack-netlib/SRC/cgelq.f
@@ -98,7 +98,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1 or -2, then a workspace query is assumed. The routine
*> only calculates the sizes of the T and WORK arrays, returns these
*> values as the first entries of the T and WORK arrays, and no error
@@ -295,9 +295,9 @@ SUBROUTINE CGELQ( M, N, A, LDA, T, TSIZE, WORK, LWORK,
T( 2 ) = MB
T( 3 ) = NB
IF( MINW ) THEN
- WORK( 1 ) = SROUNDUP_LWORK(LWMIN)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
ELSE
- WORK( 1 ) = SROUNDUP_LWORK(LWREQ)
+ WORK( 1 ) = SROUNDUP_LWORK( LWREQ )
END IF
END IF
IF( INFO.NE.0 ) THEN
@@ -322,7 +322,7 @@ SUBROUTINE CGELQ( M, N, A, LDA, T, TSIZE, WORK, LWORK,
$ LWORK, INFO )
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(LWREQ)
+ WORK( 1 ) = SROUNDUP_LWORK( LWREQ )
*
RETURN
*
diff --git a/lapack-netlib/SRC/cgelqf.f b/lapack-netlib/SRC/cgelqf.f
index 75f5bc9601..3847a958a7 100644
--- a/lapack-netlib/SRC/cgelqf.f
+++ b/lapack-netlib/SRC/cgelqf.f
@@ -93,7 +93,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,M).
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M, otherwise.
*> For optimum performance LWORK >= M*NB, where NB is the
*> optimal blocksize.
*>
@@ -175,9 +176,8 @@ SUBROUTINE CGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
* Test the input arguments
*
INFO = 0
+ K = MIN( M, N )
NB = ILAENV( 1, 'CGELQF', ' ', M, N, -1, -1 )
- LWKOPT = M*NB
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -185,19 +185,25 @@ SUBROUTINE CGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
INFO = -2
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
- INFO = -7
+ ELSE IF( .NOT.LQUERY ) THEN
+ IF( LWORK.LE.0 .OR. ( N.GT.0 .AND. LWORK.LT.MAX( 1, M ) ) )
+ $ INFO = -7
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'CGELQF', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
+ IF( K.EQ.0 ) THEN
+ LWKOPT = 1
+ ELSE
+ LWKOPT = M*NB
+ END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
END IF
*
* Quick return if possible
*
- K = MIN( M, N )
IF( K.EQ.0 ) THEN
WORK( 1 ) = 1
RETURN
@@ -267,7 +273,7 @@ SUBROUTINE CGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
$ CALL CGELQ2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
$ IINFO )
*
- WORK( 1 ) = SROUNDUP_LWORK(IWS)
+ WORK( 1 ) = SROUNDUP_LWORK( IWS )
RETURN
*
* End of CGELQF
diff --git a/lapack-netlib/SRC/cgemlq.f b/lapack-netlib/SRC/cgemlq.f
index e0cf78bc0f..e5b02b6693 100644
--- a/lapack-netlib/SRC/cgemlq.f
+++ b/lapack-netlib/SRC/cgemlq.f
@@ -110,16 +110,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
+*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1, then a workspace query is assumed. The routine
*> only calculates the size of the WORK array, returns this
-*> value as WORK(1), and no error message related to WORK
+*> value as WORK(1), and no error message related to WORK
*> is issued by XERBLA.
*> \endverbatim
*>
@@ -143,7 +144,7 @@
*>
*> \verbatim
*>
-*> These details are particular for this LAPACK implementation. Users should not
+*> These details are particular for this LAPACK implementation. Users should not
*> take them for granted. These details may change in the future, and are not likely
*> true for another LAPACK implementation. These details are relevant if one wants
*> to try to understand the code. They are not part of the interface.
@@ -159,11 +160,13 @@
*> block sizes MB and NB returned by ILAENV, CGELQ will use either
*> CLASWLQ (if the matrix is wide-and-short) or CGELQT to compute
*> the LQ factorization.
-*> This version of CGEMLQ will use either CLAMSWLQ or CGEMLQT to
+*> This version of CGEMLQ will use either CLAMSWLQ or CGEMLQT to
*> multiply matrix Q by another matrix.
*> Further Details in CLAMSWLQ or CGEMLQT.
*> \endverbatim
*>
+*> \ingroup gemlq
+*>
* =====================================================================
SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ C, LDC, WORK, LWORK, INFO )
@@ -185,11 +188,12 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
* ..
* .. Local Scalars ..
LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER MB, NB, LW, NBLCKS, MN
+ INTEGER MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
- EXTERNAL LSAME
+ REAL SROUNDUP_LWORK
+ EXTERNAL LSAME, SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL CLAMSWLQ, CGEMLQT, XERBLA
@@ -201,7 +205,7 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Test the input arguments
*
- LQUERY = LWORK.EQ.-1
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'C' )
LEFT = LSAME( SIDE, 'L' )
@@ -216,6 +220,13 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
LW = M * MB
MN = N
END IF
+*
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
*
IF( ( NB.GT.K ) .AND. ( MN.GT.K ) ) THEN
IF( MOD( MN - K, NB - K ) .EQ. 0 ) THEN
@@ -244,12 +255,12 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
INFO = -9
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
INFO = -11
- ELSE IF( ( LWORK.LT.MAX( 1, LW ) ) .AND. ( .NOT.LQUERY ) ) THEN
+ ELSE IF( ( LWORK.LT.LWMIN ) .AND. ( .NOT.LQUERY ) ) THEN
INFO = -13
END IF
*
IF( INFO.EQ.0 ) THEN
- WORK( 1 ) = REAL( LW )
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -261,7 +272,7 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Quick return if possible
*
- IF( MIN( M, N, K ).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
*
@@ -274,7 +285,7 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ MB, C, LDC, WORK, LWORK, INFO )
END IF
*
- WORK( 1 ) = REAL( LW )
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
*
RETURN
*
diff --git a/lapack-netlib/SRC/cgemqr.f b/lapack-netlib/SRC/cgemqr.f
index ea9de146e5..0b7dd9dd71 100644
--- a/lapack-netlib/SRC/cgemqr.f
+++ b/lapack-netlib/SRC/cgemqr.f
@@ -111,16 +111,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
+*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1, then a workspace query is assumed. The routine
*> only calculates the size of the WORK array, returns this
-*> value as WORK(1), and no error message related to WORK
+*> value as WORK(1), and no error message related to WORK
*> is issued by XERBLA.
*> \endverbatim
*>
@@ -144,7 +145,7 @@
*>
*> \verbatim
*>
-*> These details are particular for this LAPACK implementation. Users should not
+*> These details are particular for this LAPACK implementation. Users should not
*> take them for granted. These details may change in the future, and are not likely
*> true for another LAPACK implementation. These details are relevant if one wants
*> to try to understand the code. They are not part of the interface.
@@ -166,6 +167,8 @@
*>
*> \endverbatim
*>
+*> \ingroup gemqr
+*>
* =====================================================================
SUBROUTINE CGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ C, LDC, WORK, LWORK, INFO )
@@ -187,11 +190,12 @@ SUBROUTINE CGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
* ..
* .. Local Scalars ..
LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER MB, NB, LW, NBLCKS, MN
+ INTEGER MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
- EXTERNAL LSAME
+ REAL SROUNDUP_LWORK
+ EXTERNAL LSAME, SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL CGEMQRT, CLAMTSQR, XERBLA
@@ -203,7 +207,7 @@ SUBROUTINE CGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Test the input arguments
*
- LQUERY = LWORK.EQ.-1
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'C' )
LEFT = LSAME( SIDE, 'L' )
@@ -218,6 +222,13 @@ SUBROUTINE CGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
LW = MB * NB
MN = N
END IF
+*
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
*
IF( ( MB.GT.K ) .AND. ( MN.GT.K ) ) THEN
IF( MOD( MN - K, MB - K ).EQ.0 ) THEN
@@ -251,7 +262,7 @@ SUBROUTINE CGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
END IF
*
IF( INFO.EQ.0 ) THEN
- WORK( 1 ) = LW
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -263,7 +274,7 @@ SUBROUTINE CGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Quick return if possible
*
- IF( MIN( M, N, K ).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
*
@@ -276,7 +287,7 @@ SUBROUTINE CGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ NB, C, LDC, WORK, LWORK, INFO )
END IF
*
- WORK( 1 ) = LW
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
*
RETURN
*
diff --git a/lapack-netlib/SRC/cgeqlf.f b/lapack-netlib/SRC/cgeqlf.f
index 918bbddad5..6c67344c5c 100644
--- a/lapack-netlib/SRC/cgeqlf.f
+++ b/lapack-netlib/SRC/cgeqlf.f
@@ -88,7 +88,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,N).
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
*> For optimum performance LWORK >= N*NB, where NB is
*> the optimal blocksize.
*>
@@ -187,10 +188,11 @@ SUBROUTINE CGEQLF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
NB = ILAENV( 1, 'CGEQLF', ' ', M, N, -1, -1 )
LWKOPT = N*NB
END IF
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
- IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
- INFO = -7
+ IF( .NOT.LQUERY ) THEN
+ IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) )
+ $ INFO = -7
END IF
END IF
*
@@ -277,7 +279,7 @@ SUBROUTINE CGEQLF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
IF( MU.GT.0 .AND. NU.GT.0 )
$ CALL CGEQL2( MU, NU, A, LDA, TAU, WORK, IINFO )
*
- WORK( 1 ) = SROUNDUP_LWORK(IWS)
+ WORK( 1 ) = SROUNDUP_LWORK( IWS )
RETURN
*
* End of CGEQLF
diff --git a/lapack-netlib/SRC/cgeqp3rk.f b/lapack-netlib/SRC/cgeqp3rk.f
index 5878606840..731c44edb4 100644
--- a/lapack-netlib/SRC/cgeqp3rk.f
+++ b/lapack-netlib/SRC/cgeqp3rk.f
@@ -428,7 +428,8 @@
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*. LWORK >= N+NRHS-1
+*> LWORK >= 1, if MIN(M,N) = 0, and
+*> LWORK >= N+NRHS-1, otherwise.
*> For optimal performance LWORK >= NB*( N+NRHS+1 ),
*> where NB is the optimal block size for CGEQP3RK returned
*> by ILAENV. Minimal block size MINNB=2.
@@ -627,8 +628,9 @@ SUBROUTINE CGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
* .. External Functions ..
LOGICAL SISNAN
INTEGER ISAMAX, ILAENV
- REAL SLAMCH, SCNRM2
- EXTERNAL SISNAN, SLAMCH, SCNRM2, ISAMAX, ILAENV
+ REAL SLAMCH, SCNRM2, SROUNDUP_LWORK
+ EXTERNAL SISNAN, SLAMCH, SCNRM2, ISAMAX, ILAENV,
+ $ SROUNDUP_LWORK
* ..
* .. Intrinsic Functions ..
INTRINSIC CMPLX, MAX, MIN
@@ -703,7 +705,7 @@ SUBROUTINE CGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
*
LWKOPT = 2*N + NB*( N+NRHS+1 )
END IF
- WORK( 1 ) = CMPLX( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
IF( ( LWORK.LT.IWS ) .AND. .NOT.LQUERY ) THEN
INFO = -15
@@ -726,7 +728,7 @@ SUBROUTINE CGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
K = 0
MAXC2NRMK = ZERO
RELMAXC2NRMK = ZERO
- WORK( 1 ) = CMPLX( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
END IF
*
@@ -778,7 +780,7 @@ SUBROUTINE CGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
*
* Array TAU is not set and contains undefined elements.
*
- WORK( 1 ) = CMPLX( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
END IF
*
@@ -797,7 +799,7 @@ SUBROUTINE CGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
TAU( J ) = CZERO
END DO
*
- WORK( 1 ) = CMPLX( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
*
END IF
@@ -828,7 +830,7 @@ SUBROUTINE CGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
DO J = 1, MINMN
TAU( J ) = CZERO
END DO
- WORK( 1 ) = CMPLX( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
END IF
*
@@ -873,7 +875,7 @@ SUBROUTINE CGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
TAU( J ) = CZERO
END DO
*
- WORK( 1 ) = CMPLX( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
END IF
*
@@ -991,7 +993,7 @@ SUBROUTINE CGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
*
* Return from the routine.
*
- WORK( 1 ) = CMPLX( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
@@ -1082,7 +1084,7 @@ SUBROUTINE CGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
*
END IF
*
- WORK( 1 ) = CMPLX( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/cgeqr.f b/lapack-netlib/SRC/cgeqr.f
index d10e3da65f..3617594d02 100644
--- a/lapack-netlib/SRC/cgeqr.f
+++ b/lapack-netlib/SRC/cgeqr.f
@@ -99,7 +99,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1 or -2, then a workspace query is assumed. The routine
*> only calculates the sizes of the T and WORK arrays, returns these
*> values as the first entries of the T and WORK arrays, and no error
@@ -168,6 +168,8 @@
*>
*> \endverbatim
*>
+*> \ingroup geqr
+*>
* =====================================================================
SUBROUTINE CGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
$ INFO )
@@ -188,11 +190,12 @@ SUBROUTINE CGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, LMINWS, MINT, MINW
- INTEGER MB, NB, MINTSZ, NBLCKS
+ INTEGER MB, NB, MINTSZ, NBLCKS, LWMIN, LWREQ
* ..
* .. External Functions ..
LOGICAL LSAME
- EXTERNAL LSAME
+ REAL SROUNDUP_LWORK
+ EXTERNAL LSAME, SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL CLATSQR, CGEQRT, XERBLA
@@ -244,8 +247,10 @@ SUBROUTINE CGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
*
* Determine if the workspace size satisfies minimal size
*
+ LWMIN = MAX( 1, N )
+ LWREQ = MAX( 1, N*NB )
LMINWS = .FALSE.
- IF( ( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) .OR. LWORK.LT.NB*N )
+ IF( ( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) .OR. LWORK.LT.LWREQ )
$ .AND. ( LWORK.GE.N ) .AND. ( TSIZE.GE.MINTSZ )
$ .AND. ( .NOT.LQUERY ) ) THEN
IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) ) THEN
@@ -253,7 +258,7 @@ SUBROUTINE CGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
NB = 1
MB = M
END IF
- IF( LWORK.LT.NB*N ) THEN
+ IF( LWORK.LT.LWREQ ) THEN
LMINWS = .TRUE.
NB = 1
END IF
@@ -268,7 +273,7 @@ SUBROUTINE CGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
ELSE IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 )
$ .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
INFO = -6
- ELSE IF( ( LWORK.LT.MAX( 1, N*NB ) ) .AND. ( .NOT.LQUERY )
+ ELSE IF( ( LWORK.LT.LWREQ ) .AND. ( .NOT.LQUERY )
$ .AND. ( .NOT.LMINWS ) ) THEN
INFO = -8
END IF
@@ -282,9 +287,9 @@ SUBROUTINE CGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
T( 2 ) = MB
T( 3 ) = NB
IF( MINW ) THEN
- WORK( 1 ) = MAX( 1, N )
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
ELSE
- WORK( 1 ) = MAX( 1, NB*N )
+ WORK( 1 ) = SROUNDUP_LWORK( LWREQ )
END IF
END IF
IF( INFO.NE.0 ) THEN
@@ -309,7 +314,7 @@ SUBROUTINE CGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
$ LWORK, INFO )
END IF
*
- WORK( 1 ) = MAX( 1, NB*N )
+ WORK( 1 ) = SROUNDUP_LWORK( LWREQ )
*
RETURN
*
diff --git a/lapack-netlib/SRC/cgeqrfp.f b/lapack-netlib/SRC/cgeqrfp.f
index eaf98ddf34..5b6226c67b 100644
--- a/lapack-netlib/SRC/cgeqrfp.f
+++ b/lapack-netlib/SRC/cgeqrfp.f
@@ -97,7 +97,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,N).
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
*> For optimum performance LWORK >= N*NB, where NB is
*> the optimal blocksize.
*>
@@ -162,8 +163,8 @@ SUBROUTINE CGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
* .. Local Scalars ..
LOGICAL LQUERY
- INTEGER I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
- $ NBMIN, NX
+ INTEGER I, IB, IINFO, IWS, K, LDWORK, LWKMIN, LWKOPT,
+ $ NB, NBMIN, NX
* ..
* .. External Subroutines ..
EXTERNAL CGEQR2P, CLARFB, CLARFT, XERBLA
@@ -182,8 +183,16 @@ SUBROUTINE CGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
INFO = 0
NB = ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
- LWKOPT = N*NB
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ K = MIN( M, N )
+ IF( K.EQ.0 ) THEN
+ LWKMIN = 1
+ LWKOPT = 1
+ ELSE
+ LWKMIN = N
+ LWKOPT = N*NB
+ END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
+*
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -191,7 +200,7 @@ SUBROUTINE CGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
INFO = -2
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -7
END IF
IF( INFO.NE.0 ) THEN
@@ -203,7 +212,6 @@ SUBROUTINE CGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
* Quick return if possible
*
- K = MIN( M, N )
IF( K.EQ.0 ) THEN
WORK( 1 ) = 1
RETURN
@@ -211,7 +219,7 @@ SUBROUTINE CGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
NBMIN = 2
NX = 0
- IWS = N
+ IWS = LWKMIN
IF( NB.GT.1 .AND. NB.LT.K ) THEN
*
* Determine when to cross over from blocked to unblocked code.
@@ -273,7 +281,7 @@ SUBROUTINE CGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
$ CALL CGEQR2P( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
$ IINFO )
*
- WORK( 1 ) = SROUNDUP_LWORK(IWS)
+ WORK( 1 ) = SROUNDUP_LWORK( IWS )
RETURN
*
* End of CGEQRFP
diff --git a/lapack-netlib/SRC/cgesvdx.f b/lapack-netlib/SRC/cgesvdx.f
index fbdb121ca7..e1856a65fd 100644
--- a/lapack-netlib/SRC/cgesvdx.f
+++ b/lapack-netlib/SRC/cgesvdx.f
@@ -208,7 +208,7 @@
*> \param[out] WORK
*> \verbatim
*> WORK is COMPLEX array, dimension (MAX(1,LWORK))
-*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK;
+*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
@@ -261,7 +261,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complexGEsing
+*> \ingroup gesvdx
*
* =====================================================================
SUBROUTINE CGESVDX( JOBU, JOBVT, RANGE, M, N, A, LDA, VL, VU,
@@ -312,8 +312,8 @@ SUBROUTINE CGESVDX( JOBU, JOBVT, RANGE, M, N, A, LDA, VL, VU,
* .. External Functions ..
LOGICAL LSAME
INTEGER ILAENV
- REAL SLAMCH, CLANGE
- EXTERNAL LSAME, ILAENV, SLAMCH, CLANGE
+ REAL SLAMCH, CLANGE, SROUNDUP_LWORK
+ EXTERNAL LSAME, ILAENV, SLAMCH, CLANGE, SROUNDUP_LWORK
* ..
* .. Intrinsic Functions ..
INTRINSIC MAX, MIN, SQRT
@@ -448,7 +448,7 @@ SUBROUTINE CGESVDX( JOBU, JOBVT, RANGE, M, N, A, LDA, VL, VU,
END IF
END IF
MAXWRK = MAX( MAXWRK, MINWRK )
- WORK( 1 ) = CMPLX( REAL( MAXWRK ), ZERO )
+ WORK( 1 ) = SROUNDUP_LWORK( MAXWRK )
*
IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
INFO = -19
@@ -464,7 +464,7 @@ SUBROUTINE CGESVDX( JOBU, JOBVT, RANGE, M, N, A, LDA, VL, VU,
*
* Quick return if possible
*
- IF( M.EQ.0 .OR. N.EQ.0 ) THEN
+ IF( MINMN.EQ.0 ) THEN
RETURN
END IF
*
@@ -846,7 +846,7 @@ SUBROUTINE CGESVDX( JOBU, JOBVT, RANGE, M, N, A, LDA, VL, VU,
*
* Return optimal workspace in WORK(1)
*
- WORK( 1 ) = CMPLX( REAL( MAXWRK ), ZERO )
+ WORK( 1 ) = SROUNDUP_LWORK( MAXWRK )
*
RETURN
*
diff --git a/lapack-netlib/SRC/cgesvj.f b/lapack-netlib/SRC/cgesvj.f
index 149cf5e484..b9c8f1709e 100644
--- a/lapack-netlib/SRC/cgesvj.f
+++ b/lapack-netlib/SRC/cgesvj.f
@@ -208,15 +208,17 @@
*> \verbatim
*> CWORK is COMPLEX array, dimension (max(1,LWORK))
*> Used as workspace.
-*> If on entry LWORK = -1, then a workspace query is assumed and
-*> no computation is done; CWORK(1) is set to the minial (and optimal)
-*> length of CWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER.
-*> Length of CWORK, LWORK >= M+N.
+*> Length of CWORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M+N, otherwise.
+*>
+*> If on entry LWORK = -1, then a workspace query is assumed and
+*> no computation is done; CWORK(1) is set to the minial (and optimal)
+*> length of CWORK.
*> \endverbatim
*>
*> \param[in,out] RWORK
@@ -247,15 +249,17 @@
*> RWORK(6) = the largest absolute value over all sines of the
*> Jacobi rotation angles in the last sweep. It can be
*> useful for a post festum analysis.
-*> If on entry LRWORK = -1, then a workspace query is assumed and
-*> no computation is done; RWORK(1) is set to the minial (and optimal)
-*> length of RWORK.
*> \endverbatim
*>
*> \param[in] LRWORK
*> \verbatim
*> LRWORK is INTEGER
-*> Length of RWORK, LRWORK >= MAX(6,N).
+*> Length of RWORK.
+*> LRWORK >= 1, if MIN(M,N) = 0, and LRWORK >= MAX(6,N), otherwise
+*>
+*> If on entry LRWORK = -1, then a workspace query is assumed and
+*> no computation is done; RWORK(1) is set to the minial (and optimal)
+*> length of RWORK.
*> \endverbatim
*>
*> \param[out] INFO
@@ -276,7 +280,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complexGEcomputational
+*> \ingroup gesvj
*
*> \par Further Details:
* =====================
@@ -374,16 +378,17 @@ SUBROUTINE CGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
PARAMETER ( NSWEEP = 30 )
* ..
* .. Local Scalars ..
- COMPLEX AAPQ, OMPQ
- REAL AAPP, AAPP0, AAPQ1, AAQQ, APOAQ, AQOAP, BIG,
- $ BIGTHETA, CS, CTOL, EPSLN, MXAAPQ,
- $ MXSINJ, ROOTBIG, ROOTEPS, ROOTSFMIN, ROOTTOL,
- $ SKL, SFMIN, SMALL, SN, T, TEMP1, THETA, THSIGN, TOL
- INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
- $ ISWROT, jbc, jgl, KBL, LKAHEAD, MVL, N2, N34,
- $ N4, NBL, NOTROT, p, PSKIPPED, q, ROWSKIP, SWBAND
- LOGICAL APPLV, GOSCALE, LOWER, LQUERY, LSVEC, NOSCALE, ROTOK,
- $ RSVEC, UCTOL, UPPER
+ COMPLEX AAPQ, OMPQ
+ REAL AAPP, AAPP0, AAPQ1, AAQQ, APOAQ, AQOAP, BIG,
+ $ BIGTHETA, CS, CTOL, EPSLN, MXAAPQ,
+ $ MXSINJ, ROOTBIG, ROOTEPS, ROOTSFMIN, ROOTTOL,
+ $ SKL, SFMIN, SMALL, SN, T, TEMP1, THETA, THSIGN, TOL
+ INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
+ $ ISWROT, jbc, jgl, KBL, LKAHEAD, MVL, N2, N34,
+ $ N4, NBL, NOTROT, p, PSKIPPED, q, ROWSKIP, SWBAND,
+ $ MINMN, LWMIN, LRWMIN
+ LOGICAL APPLV, GOSCALE, LOWER, LQUERY, LSVEC, NOSCALE, ROTOK,
+ $ RSVEC, UCTOL, UPPER
* ..
* ..
* .. Intrinsic Functions ..
@@ -398,8 +403,8 @@ SUBROUTINE CGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
INTEGER ISAMAX
EXTERNAL ISAMAX
* from LAPACK
- REAL SLAMCH
- EXTERNAL SLAMCH
+ REAL SLAMCH, SROUNDUP_LWORK
+ EXTERNAL SLAMCH, SROUNDUP_LWORK
LOGICAL LSAME
EXTERNAL LSAME
* ..
@@ -422,7 +427,16 @@ SUBROUTINE CGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
UPPER = LSAME( JOBA, 'U' )
LOWER = LSAME( JOBA, 'L' )
*
- LQUERY = ( LWORK .EQ. -1 ) .OR. ( LRWORK .EQ. -1 )
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWMIN = 1
+ LRWMIN = 1
+ ELSE
+ LWMIN = M + N
+ LRWMIN = MAX( 6, N )
+ END IF
+*
+ LQUERY = ( LWORK.EQ.-1 ) .OR. ( LRWORK.EQ.-1 )
IF( .NOT.( UPPER .OR. LOWER .OR. LSAME( JOBA, 'G' ) ) ) THEN
INFO = -1
ELSE IF( .NOT.( LSVEC .OR. UCTOL .OR. LSAME( JOBU, 'N' ) ) ) THEN
@@ -442,9 +456,9 @@ SUBROUTINE CGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
INFO = -11
ELSE IF( UCTOL .AND. ( RWORK( 1 ).LE.ONE ) ) THEN
INFO = -12
- ELSE IF( LWORK.LT.( M+N ) .AND. ( .NOT.LQUERY ) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. ( .NOT.LQUERY ) ) THEN
INFO = -13
- ELSE IF( LRWORK.LT.MAX( N, 6 ) .AND. ( .NOT.LQUERY ) ) THEN
+ ELSE IF( LRWORK.LT.LRWMIN .AND. ( .NOT.LQUERY ) ) THEN
INFO = -15
ELSE
INFO = 0
@@ -454,15 +468,15 @@ SUBROUTINE CGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'CGESVJ', -INFO )
RETURN
- ELSE IF ( LQUERY ) THEN
- CWORK(1) = M + N
- RWORK(1) = MAX( N, 6 )
+ ELSE IF( LQUERY ) THEN
+ CWORK( 1 ) = SROUNDUP_LWORK( LWMIN )
+ RWORK( 1 ) = SROUNDUP_LWORK( LRWMIN )
RETURN
END IF
*
* #:) Quick return for void matrix
*
- IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )RETURN
+ IF( MINMN.EQ.0 ) RETURN
*
* Set numerical parameters
* The stopping criterion for Jacobi rotations is
diff --git a/lapack-netlib/SRC/cgetri.f b/lapack-netlib/SRC/cgetri.f
index 2060d1444f..2eb3da7abe 100644
--- a/lapack-netlib/SRC/cgetri.f
+++ b/lapack-netlib/SRC/cgetri.f
@@ -153,8 +153,8 @@ SUBROUTINE CGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
*
INFO = 0
NB = ILAENV( 1, 'CGETRI', ' ', N, -1, -1, -1 )
- LWKOPT = N*NB
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ LWKOPT = MAX( 1, N*NB )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
LQUERY = ( LWORK.EQ.-1 )
IF( N.LT.0 ) THEN
INFO = -1
@@ -252,7 +252,7 @@ SUBROUTINE CGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
$ CALL CSWAP( N, A( 1, J ), 1, A( 1, JP ), 1 )
60 CONTINUE
*
- WORK( 1 ) = SROUNDUP_LWORK(IWS)
+ WORK( 1 ) = SROUNDUP_LWORK( IWS )
RETURN
*
* End of CGETRI
diff --git a/lapack-netlib/SRC/cgetsls.f b/lapack-netlib/SRC/cgetsls.f
index b4bb7562fc..3f43dc8de0 100644
--- a/lapack-netlib/SRC/cgetsls.f
+++ b/lapack-netlib/SRC/cgetsls.f
@@ -127,7 +127,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1 or -2, then a workspace query is assumed.
*> If LWORK = -1, the routine calculates optimal size of WORK for the
*> optimal performance and returns this value in WORK(1).
@@ -229,7 +229,10 @@ SUBROUTINE CGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
*
* Determine the optimum and minimum LWORK
*
- IF( M.GE.N ) THEN
+ IF( MIN( M, N, NRHS ).EQ.0 ) THEN
+ WSIZEO = 1
+ WSIZEM = 1
+ ELSE IF ( M.GE.N ) THEN
CALL CGEQR( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 )
TSZO = INT( TQ( 1 ) )
LWO = INT( WORKQ( 1 ) )
diff --git a/lapack-netlib/SRC/cgetsqrhrt.f b/lapack-netlib/SRC/cgetsqrhrt.f
index 4e4dc1d4ad..087e9bc7fa 100644
--- a/lapack-netlib/SRC/cgetsqrhrt.f
+++ b/lapack-netlib/SRC/cgetsqrhrt.f
@@ -131,13 +131,15 @@
*> \param[in] LWORK
*> \verbatim
*> The dimension of the array WORK.
-*> LWORK >= MAX( LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) ),
+*> If MIN(M,N) = 0, LWORK >= 1, else
+*> LWORK >= MAX( 1, LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) ),
*> where
*> NUM_ALL_ROW_BLOCKS = CEIL((M-N)/(MB1-N)),
*> NB1LOCAL = MIN(NB1,N).
*> LWT = NUM_ALL_ROW_BLOCKS * N * NB1LOCAL,
*> LW1 = NB1LOCAL * N,
-*> LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) ),
+*> LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) ).
+*>
*> If LWORK = -1, then a workspace query is assumed.
*> The routine only calculates the optimal size of the WORK
*> array, returns this value as the first entry of the WORK
@@ -160,7 +162,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup comlpexOTHERcomputational
+*> \ingroup getsqrhrt
*
*> \par Contributors:
* ==================
@@ -200,6 +202,10 @@ SUBROUTINE CGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
INTEGER I, IINFO, J, LW1, LW2, LWT, LDWT, LWORKOPT,
$ NB1LOCAL, NB2LOCAL, NUM_ALL_ROW_BLOCKS
* ..
+* .. External Functions ..
+ REAL SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
+* ..
* .. External Subroutines ..
EXTERNAL CCOPY, CLATSQR, CUNGTSQR_ROW, CUNHR_COL,
$ XERBLA
@@ -212,7 +218,7 @@ SUBROUTINE CGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
* Test the input arguments
*
INFO = 0
- LQUERY = LWORK.EQ.-1
+ LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
ELSE IF( N.LT.0 .OR. M.LT.N ) THEN
@@ -225,7 +231,7 @@ SUBROUTINE CGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
INFO = -5
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -7
- ELSE IF( LDT.LT.MAX( 1, MIN( NB2, N ) ) ) THEN
+ ELSE IF( LDT.LT.MAX( 1, MIN( NB2, N ) ) ) THEN
INFO = -9
ELSE
*
@@ -263,8 +269,9 @@ SUBROUTINE CGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) )
*
LWORKOPT = MAX( LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) )
+ LWORKOPT = MAX( 1, LWORKOPT )
*
- IF( ( LWORK.LT.MAX( 1, LWORKOPT ) ).AND.(.NOT.LQUERY) ) THEN
+ IF( LWORK.LT.LWORKOPT .AND. .NOT.LQUERY ) THEN
INFO = -11
END IF
*
@@ -277,14 +284,14 @@ SUBROUTINE CGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
CALL XERBLA( 'CGETSQRHRT', -INFO )
RETURN
ELSE IF ( LQUERY ) THEN
- WORK( 1 ) = CMPLX( LWORKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWORKOPT )
RETURN
END IF
*
* Quick return if possible
*
IF( MIN( M, N ).EQ.0 ) THEN
- WORK( 1 ) = CMPLX( LWORKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWORKOPT )
RETURN
END IF
*
@@ -341,9 +348,9 @@ SUBROUTINE CGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
END IF
END DO
*
- WORK( 1 ) = CMPLX( LWORKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWORKOPT )
RETURN
*
* End of CGETSQRHRT
*
- END
\ No newline at end of file
+ END
diff --git a/lapack-netlib/SRC/cgges3.f b/lapack-netlib/SRC/cgges3.f
index aac9f95103..c1ca796887 100644
--- a/lapack-netlib/SRC/cgges3.f
+++ b/lapack-netlib/SRC/cgges3.f
@@ -215,7 +215,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= MAX(1,2*N).
+*> For good performance, LWORK must generally be larger.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -260,7 +261,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complexGEeigen
+*> \ingroup gges3
*
* =====================================================================
SUBROUTINE CGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
@@ -300,7 +301,8 @@ SUBROUTINE CGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
$ LQUERY, WANTST
INTEGER I, ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT,
- $ ILO, IRIGHT, IROWS, IRWRK, ITAU, IWRK, LWKOPT
+ $ ILO, IRIGHT, IROWS, IRWRK, ITAU, IWRK, LWKOPT,
+ $ LWKMIN
REAL ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PVSL,
$ PVSR, SMLNUM
* ..
@@ -310,13 +312,12 @@ SUBROUTINE CGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
* ..
* .. External Subroutines ..
EXTERNAL CGEQRF, CGGBAK, CGGBAL, CGGHD3, CLAQZ0, CLACPY,
- $ CLASCL, CLASET, CTGSEN, CUNGQR, CUNMQR, SLABAD,
- $ XERBLA
+ $ CLASCL, CLASET, CTGSEN, CUNGQR, CUNMQR, XERBLA
* ..
* .. External Functions ..
LOGICAL LSAME
- REAL CLANGE, SLAMCH
- EXTERNAL LSAME, CLANGE, SLAMCH
+ REAL CLANGE, SLAMCH, SROUNDUP_LWORK
+ EXTERNAL LSAME, CLANGE, SLAMCH, SROUNDUP_LWORK
* ..
* .. Intrinsic Functions ..
INTRINSIC MAX, SQRT
@@ -353,6 +354,8 @@ SUBROUTINE CGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
*
INFO = 0
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 2*N )
+*
IF( IJOBVL.LE.0 ) THEN
INFO = -1
ELSE IF( IJOBVR.LE.0 ) THEN
@@ -369,7 +372,7 @@ SUBROUTINE CGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
INFO = -14
ELSE IF( LDVSR.LT.1 .OR. ( ILVSR .AND. LDVSR.LT.N ) ) THEN
INFO = -16
- ELSE IF( LWORK.LT.MAX( 1, 2*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -18
END IF
*
@@ -377,29 +380,33 @@ SUBROUTINE CGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
*
IF( INFO.EQ.0 ) THEN
CALL CGEQRF( N, N, B, LDB, WORK, WORK, -1, IERR )
- LWKOPT = MAX( 1, N + INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKMIN, N + INT( WORK( 1 ) ) )
CALL CUNMQR( 'L', 'C', N, N, N, B, LDB, WORK, A, LDA, WORK,
$ -1, IERR )
- LWKOPT = MAX( LWKOPT, N + INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, N + INT( WORK( 1 ) ) )
IF( ILVSL ) THEN
CALL CUNGQR( N, N, N, VSL, LDVSL, WORK, WORK, -1,
$ IERR )
- LWKOPT = MAX( LWKOPT, N + INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, N + INT( WORK( 1 ) ) )
END IF
CALL CGGHD3( JOBVSL, JOBVSR, N, 1, N, A, LDA, B, LDB, VSL,
$ LDVSL, VSR, LDVSR, WORK, -1, IERR )
- LWKOPT = MAX( LWKOPT, N + INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, N + INT( WORK( 1 ) ) )
CALL CLAQZ0( 'S', JOBVSL, JOBVSR, N, 1, N, A, LDA, B, LDB,
$ ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK, -1,
$ RWORK, 0, IERR )
- LWKOPT = MAX( LWKOPT, INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, INT( WORK( 1 ) ) )
IF( WANTST ) THEN
CALL CTGSEN( 0, ILVSL, ILVSR, BWORK, N, A, LDA, B, LDB,
$ ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, SDIM,
$ PVSL, PVSR, DIF, WORK, -1, IDUM, 1, IERR )
- LWKOPT = MAX( LWKOPT, INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, INT( WORK( 1 ) ) )
+ END IF
+ IF( N.EQ.0 ) THEN
+ WORK( 1 ) = 1
+ ELSE
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
- WORK( 1 ) = CMPLX( LWKOPT )
END IF
*
@@ -422,7 +429,6 @@ SUBROUTINE CGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
EPS = SLAMCH( 'P' )
SMLNUM = SLAMCH( 'S' )
BIGNUM = ONE / SMLNUM
- CALL SLABAD( SMLNUM, BIGNUM )
SMLNUM = SQRT( SMLNUM ) / EPS
BIGNUM = ONE / SMLNUM
*
@@ -585,7 +591,7 @@ SUBROUTINE CGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
*
30 CONTINUE
*
- WORK( 1 ) = CMPLX( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/cggev3.f b/lapack-netlib/SRC/cggev3.f
index 9483ecdeb1..d2b75aebc7 100644
--- a/lapack-netlib/SRC/cggev3.f
+++ b/lapack-netlib/SRC/cggev3.f
@@ -174,7 +174,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= MAX(1,2*N).
+*> For good performance, LWORK must generally be larger.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -208,7 +209,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complexGEeigen
+*> \ingroup ggev3
*
* =====================================================================
SUBROUTINE CGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
@@ -243,7 +244,7 @@ SUBROUTINE CGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
CHARACTER CHTEMP
INTEGER ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
$ IN, IRIGHT, IROWS, IRWRK, ITAU, IWRK, JC, JR,
- $ LWKOPT
+ $ LWKOPT, LWKMIN
REAL ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
$ SMLNUM, TEMP
COMPLEX X
@@ -253,13 +254,12 @@ SUBROUTINE CGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
* ..
* .. External Subroutines ..
EXTERNAL CGEQRF, CGGBAK, CGGBAL, CGGHD3, CLAQZ0, CLACPY,
- $ CLASCL, CLASET, CTGEVC, CUNGQR, CUNMQR, SLABAD,
- $ XERBLA
+ $ CLASCL, CLASET, CTGEVC, CUNGQR, CUNMQR, XERBLA
* ..
* .. External Functions ..
LOGICAL LSAME
- REAL CLANGE, SLAMCH
- EXTERNAL LSAME, CLANGE, SLAMCH
+ REAL CLANGE, SLAMCH, SROUNDUP_LWORK
+ EXTERNAL LSAME, CLANGE, SLAMCH, SROUNDUP_LWORK
* ..
* .. Intrinsic Functions ..
INTRINSIC ABS, AIMAG, MAX, REAL, SQRT
@@ -301,6 +301,7 @@ SUBROUTINE CGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
*
INFO = 0
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 2*N )
IF( IJOBVL.LE.0 ) THEN
INFO = -1
ELSE IF( IJOBVR.LE.0 ) THEN
@@ -315,7 +316,7 @@ SUBROUTINE CGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
INFO = -11
ELSE IF( LDVR.LT.1 .OR. ( ILVR .AND. LDVR.LT.N ) ) THEN
INFO = -13
- ELSE IF( LWORK.LT.MAX( 1, 2*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -15
END IF
*
@@ -323,7 +324,7 @@ SUBROUTINE CGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
*
IF( INFO.EQ.0 ) THEN
CALL CGEQRF( N, N, B, LDB, WORK, WORK, -1, IERR )
- LWKOPT = MAX( N, N+INT( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKMIN, N+INT( WORK( 1 ) ) )
CALL CUNMQR( 'L', 'C', N, N, N, B, LDB, WORK, A, LDA, WORK,
$ -1, IERR )
LWKOPT = MAX( LWKOPT, N+INT( WORK( 1 ) ) )
@@ -348,7 +349,11 @@ SUBROUTINE CGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
$ RWORK, 0, IERR )
LWKOPT = MAX( LWKOPT, N+INT( WORK( 1 ) ) )
END IF
- WORK( 1 ) = CMPLX( LWKOPT )
+ IF( N.EQ.0 ) THEN
+ WORK( 1 ) = 1
+ ELSE
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
+ END IF
END IF
*
IF( INFO.NE.0 ) THEN
@@ -368,7 +373,6 @@ SUBROUTINE CGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
EPS = SLAMCH( 'E' )*SLAMCH( 'B' )
SMLNUM = SLAMCH( 'S' )
BIGNUM = ONE / SMLNUM
- CALL SLABAD( SMLNUM, BIGNUM )
SMLNUM = SQRT( SMLNUM ) / EPS
BIGNUM = ONE / SMLNUM
*
@@ -549,7 +553,7 @@ SUBROUTINE CGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
IF( ILBSCL )
$ CALL CLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
*
- WORK( 1 ) = CMPLX( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
*
* End of CGGEV3
diff --git a/lapack-netlib/SRC/cgghd3.f b/lapack-netlib/SRC/cgghd3.f
index 1074b4828e..f7175a72c7 100644
--- a/lapack-netlib/SRC/cgghd3.f
+++ b/lapack-netlib/SRC/cgghd3.f
@@ -180,14 +180,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX array, dimension (LWORK)
+*> WORK is COMPLEX array, dimension (MAX(1,LWORK))
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of the array WORK. LWORK >= 1.
+*> The length of the array WORK. LWORK >= 1.
*> For optimum performance LWORK >= 6*N*NB, where NB is the
*> optimal blocksize.
*>
@@ -212,7 +212,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complexOTHERcomputational
+*> \ingroup gghd3
*
*> \par Further Details:
* =====================
@@ -265,7 +265,8 @@ SUBROUTINE CGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
* .. External Functions ..
LOGICAL LSAME
INTEGER ILAENV
- EXTERNAL ILAENV, LSAME
+ REAL SROUNDUP_LWORK
+ EXTERNAL ILAENV, LSAME, SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL CGGHRD, CLARTG, CLASET, CUNM22, CROT, CGEMM,
@@ -280,8 +281,13 @@ SUBROUTINE CGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
*
INFO = 0
NB = ILAENV( 1, 'CGGHD3', ' ', N, ILO, IHI, -1 )
- LWKOPT = MAX( 6*N*NB, 1 )
- WORK( 1 ) = CMPLX( LWKOPT )
+ NH = IHI - ILO + 1
+ IF( NH.LE.1 ) THEN
+ LWKOPT = 1
+ ELSE
+ LWKOPT = 6*N*NB
+ END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
INITQ = LSAME( COMPQ, 'I' )
WANTQ = INITQ .OR. LSAME( COMPQ, 'V' )
INITZ = LSAME( COMPZ, 'I' )
@@ -330,7 +336,6 @@ SUBROUTINE CGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
*
* Quick return if possible
*
- NH = IHI - ILO + 1
IF( NH.LE.1 ) THEN
WORK( 1 ) = CONE
RETURN
@@ -888,7 +893,8 @@ SUBROUTINE CGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
IF ( JCOL.LT.IHI )
$ CALL CGGHRD( COMPQ2, COMPZ2, N, JCOL, IHI, A, LDA, B, LDB, Q,
$ LDQ, Z, LDZ, IERR )
- WORK( 1 ) = CMPLX( LWKOPT )
+*
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/cggqrf.f b/lapack-netlib/SRC/cggqrf.f
index 29b0bf4af3..309f170e8f 100644
--- a/lapack-netlib/SRC/cggqrf.f
+++ b/lapack-netlib/SRC/cggqrf.f
@@ -251,8 +251,8 @@ SUBROUTINE CGGQRF( N, M, P, A, LDA, TAUA, B, LDB, TAUB, WORK,
NB2 = ILAENV( 1, 'CGERQF', ' ', N, P, -1, -1 )
NB3 = ILAENV( 1, 'CUNMQR', ' ', N, M, P, -1 )
NB = MAX( NB1, NB2, NB3 )
- LWKOPT = MAX( N, M, P)*NB
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ LWKOPT = MAX( 1, MAX( N, M, P )*NB )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
LQUERY = ( LWORK.EQ.-1 )
IF( N.LT.0 ) THEN
INFO = -1
@@ -288,7 +288,7 @@ SUBROUTINE CGGQRF( N, M, P, A, LDA, TAUA, B, LDB, TAUB, WORK,
* RQ factorization of N-by-P matrix B: B = T*Z.
*
CALL CGERQF( N, P, B, LDB, TAUB, WORK, LWORK, INFO )
- WORK( 1 ) = MAX( LOPT, INT( WORK( 1 ) ) )
+ WORK( 1 ) = SROUNDUP_LWORK( MAX( LOPT, INT( WORK( 1 ) ) ) )
*
RETURN
*
diff --git a/lapack-netlib/SRC/cggrqf.f b/lapack-netlib/SRC/cggrqf.f
index 273ab3ef7b..8470a1ce22 100644
--- a/lapack-netlib/SRC/cggrqf.f
+++ b/lapack-netlib/SRC/cggrqf.f
@@ -250,8 +250,8 @@ SUBROUTINE CGGRQF( M, P, N, A, LDA, TAUA, B, LDB, TAUB, WORK,
NB2 = ILAENV( 1, 'CGEQRF', ' ', P, N, -1, -1 )
NB3 = ILAENV( 1, 'CUNMRQ', ' ', M, N, P, -1 )
NB = MAX( NB1, NB2, NB3 )
- LWKOPT = MAX( N, M, P)*NB
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ LWKOPT = MAX( 1, MAX( N, M, P )*NB )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -288,7 +288,7 @@ SUBROUTINE CGGRQF( M, P, N, A, LDA, TAUA, B, LDB, TAUB, WORK,
* QR factorization of P-by-N matrix B: B = Z*T
*
CALL CGEQRF( P, N, B, LDB, TAUB, WORK, LWORK, INFO )
- WORK( 1 ) = MAX( LOPT, INT( WORK( 1 ) ) )
+ WORK( 1 ) = SROUNDUP_LWORK( MAX( LOPT, INT( WORK( 1 ) ) ) )
*
RETURN
*
diff --git a/lapack-netlib/SRC/cggsvd3.f b/lapack-netlib/SRC/cggsvd3.f
index f248aebd52..4c4b85baee 100644
--- a/lapack-netlib/SRC/cggsvd3.f
+++ b/lapack-netlib/SRC/cggsvd3.f
@@ -278,7 +278,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -333,7 +333,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complexGEsing
+*> \ingroup ggsvd3
*
*> \par Contributors:
* ==================
diff --git a/lapack-netlib/SRC/cggsvp3.f b/lapack-netlib/SRC/cggsvp3.f
index 008a053a20..e19f7efd51 100644
--- a/lapack-netlib/SRC/cggsvp3.f
+++ b/lapack-netlib/SRC/cggsvp3.f
@@ -233,7 +233,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -256,7 +256,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complexOTHERcomputational
+*> \ingroup ggsvp3
*
*> \par Further Details:
* =====================
diff --git a/lapack-netlib/SRC/cheevd.f b/lapack-netlib/SRC/cheevd.f
index b5ca804ebe..9b62a2df60 100644
--- a/lapack-netlib/SRC/cheevd.f
+++ b/lapack-netlib/SRC/cheevd.f
@@ -116,8 +116,7 @@
*>
*> \param[out] RWORK
*> \verbatim
-*> RWORK is REAL array,
-*> dimension (LRWORK)
+*> RWORK is REAL array, dimension (MAX(1,LRWORK))
*> On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK.
*> \endverbatim
*>
@@ -282,8 +281,8 @@ SUBROUTINE CHEEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK,
LROPT = LRWMIN
LIOPT = LIWMIN
END IF
- WORK( 1 ) = SROUNDUP_LWORK(LOPT)
- RWORK( 1 ) = LROPT
+ WORK( 1 ) = SROUNDUP_LWORK( LOPT )
+ RWORK( 1 ) = SROUNDUP_LWORK( LROPT )
IWORK( 1 ) = LIOPT
*
IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
@@ -378,8 +377,8 @@ SUBROUTINE CHEEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK,
CALL SSCAL( IMAX, ONE / SIGMA, W, 1 )
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(LOPT)
- RWORK( 1 ) = LROPT
+ WORK( 1 ) = SROUNDUP_LWORK( LOPT )
+ RWORK( 1 ) = SROUNDUP_LWORK( LROPT )
IWORK( 1 ) = LIOPT
*
RETURN
diff --git a/lapack-netlib/SRC/cheevr.f b/lapack-netlib/SRC/cheevr.f
index 05c5e66be2..ad5c8cd4aa 100644
--- a/lapack-netlib/SRC/cheevr.f
+++ b/lapack-netlib/SRC/cheevr.f
@@ -272,7 +272,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of the array WORK. LWORK >= max(1,2*N).
+*> The length of the array WORK.
+*> If N <= 1, LWORK >= 1, else LWORK >= 2*N.
*> For optimal efficiency, LWORK >= (NB+1)*N,
*> where NB is the max of the blocksize for CHETRD and for
*> CUNMTR as returned by ILAENV.
@@ -294,7 +295,8 @@
*> \param[in] LRWORK
*> \verbatim
*> LRWORK is INTEGER
-*> The length of the array RWORK. LRWORK >= max(1,24*N).
+*> The length of the array RWORK.
+*> If N <= 1, LRWORK >= 1, else LRWORK >= 24*N.
*>
*> If LRWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal sizes of the WORK, RWORK
@@ -313,7 +315,8 @@
*> \param[in] LIWORK
*> \verbatim
*> LIWORK is INTEGER
-*> The dimension of the array IWORK. LIWORK >= max(1,10*N).
+*> The dimension of the array IWORK.
+*> If N <= 1, LIWORK >= 1, else LIWORK >= 10*N.
*>
*> If LIWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal sizes of the WORK, RWORK
@@ -417,9 +420,15 @@ SUBROUTINE CHEEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
LQUERY = ( ( LWORK.EQ.-1 ) .OR. ( LRWORK.EQ.-1 ) .OR.
$ ( LIWORK.EQ.-1 ) )
*
- LRWMIN = MAX( 1, 24*N )
- LIWMIN = MAX( 1, 10*N )
- LWMIN = MAX( 1, 2*N )
+ IF( N.LE.1 ) THEN
+ LWMIN = 1
+ LRWMIN = 1
+ LIWMIN = 1
+ ELSE
+ LWMIN = 2*N
+ LRWMIN = 24*N
+ LIWMIN = 10*N
+ END IF
*
INFO = 0
IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
@@ -454,8 +463,8 @@ SUBROUTINE CHEEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
NB = ILAENV( 1, 'CHETRD', UPLO, N, -1, -1, -1 )
NB = MAX( NB, ILAENV( 1, 'CUNMTR', UPLO, N, -1, -1, -1 ) )
LWKOPT = MAX( ( NB+1 )*N, LWMIN )
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
- RWORK( 1 ) = LRWMIN
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
+ RWORK( 1 ) = SROUNDUP_LWORK( LRWMIN )
IWORK( 1 ) = LIWMIN
*
IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
@@ -483,7 +492,7 @@ SUBROUTINE CHEEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
END IF
*
IF( N.EQ.1 ) THEN
- WORK( 1 ) = 2
+ WORK( 1 ) = 1
IF( ALLEIG .OR. INDEIG ) THEN
M = 1
W( 1 ) = REAL( A( 1, 1 ) )
@@ -710,8 +719,8 @@ SUBROUTINE CHEEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
*
* Set WORK(1) to optimal workspace size.
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
- RWORK( 1 ) = LRWMIN
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
+ RWORK( 1 ) = SROUNDUP_LWORK( LRWMIN )
IWORK( 1 ) = LIWMIN
*
RETURN
diff --git a/lapack-netlib/SRC/cheevr_2stage.f b/lapack-netlib/SRC/cheevr_2stage.f
index 0332a09bcd..e06925fcd0 100644
--- a/lapack-netlib/SRC/cheevr_2stage.f
+++ b/lapack-netlib/SRC/cheevr_2stage.f
@@ -265,7 +265,7 @@
*> indicating the nonzero elements in Z. The i-th eigenvector
*> is nonzero only in elements ISUPPZ( 2*i-1 ) through
*> ISUPPZ( 2*i ). This is an output of CSTEMR (tridiagonal
-*> matrix). The support of the eigenvectors of A is typically
+*> matrix). The support of the eigenvectors of A is typically
*> 1:N because of the unitary transformations applied by CUNMTR.
*> Implemented only for RANGE = 'A' or 'I' and IU - IL = N - 1
*> \endverbatim
@@ -279,12 +279,13 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK.
+*> If N <= 1, LWORK must be at least 1.
*> If JOBZ = 'N' and N > 1, LWORK must be queried.
*> LWORK = MAX(1, 26*N, dimension) where
*> dimension = max(stage1,stage2) + (KD+1)*N + N
-*> = N*KD + N*max(KD+1,FACTOPTNB)
-*> + max(2*KD*KD, KD*NTHREADS)
+*> = N*KD + N*max(KD+1,FACTOPTNB)
+*> + max(2*KD*KD, KD*NTHREADS)
*> + (KD+1)*N + N
*> where KD is the blocking size of the reduction,
*> FACTOPTNB is the blocking used by the QR or LQ
@@ -310,7 +311,8 @@
*> \param[in] LRWORK
*> \verbatim
*> LRWORK is INTEGER
-*> The length of the array RWORK. LRWORK >= max(1,24*N).
+*> The length of the array RWORK.
+*> If N <= 1, LRWORK >= 1, else LRWORK >= 24*N.
*>
*> If LRWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal sizes of the WORK, RWORK
@@ -329,7 +331,8 @@
*> \param[in] LIWORK
*> \verbatim
*> LIWORK is INTEGER
-*> The dimension of the array IWORK. LIWORK >= max(1,10*N).
+*> The dimension of the array IWORK.
+*> If N <= 1, LIWORK >= 1, else LIWORK >= 10*N.
*>
*> If LIWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal sizes of the WORK, RWORK
@@ -354,7 +357,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complexHEeigen
+*> \ingroup heevr_2stage
*
*> \par Contributors:
* ==================
@@ -382,7 +385,7 @@
*> http://doi.acm.org/10.1145/2063384.2063394
*>
*> A. Haidar, J. Kurzak, P. Luszczek, 2013.
-*> An improved parallel singular value algorithm and its implementation
+*> An improved parallel singular value algorithm and its implementation
*> for multicore hardware, In Proceedings of 2013 International Conference
*> for High Performance Computing, Networking, Storage and Analysis (SC '13).
*> Denver, Colorado, USA, 2013.
@@ -390,11 +393,11 @@
*> http://doi.acm.org/10.1145/2503210.2503292
*>
*> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
-*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
+*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
*> calculations based on fine-grained memory aware tasks.
*> International Journal of High Performance Computing Applications.
*> Volume 28 Issue 2, Pages 196-209, May 2014.
-*> http://hpc.sagepub.com/content/28/2/196
+*> http://hpc.sagepub.com/content/28/2/196
*>
*> \endverbatim
*
@@ -443,8 +446,9 @@ SUBROUTINE CHEEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
* .. External Functions ..
LOGICAL LSAME
INTEGER ILAENV, ILAENV2STAGE
- REAL SLAMCH, CLANSY
- EXTERNAL LSAME, SLAMCH, CLANSY, ILAENV, ILAENV2STAGE
+ REAL SLAMCH, CLANSY, SROUNDUP_LWORK
+ EXTERNAL LSAME, SLAMCH, CLANSY, ILAENV, ILAENV2STAGE,
+ $ SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL SCOPY, SSCAL, SSTEBZ, SSTERF, XERBLA, CSSCAL,
@@ -472,9 +476,16 @@ SUBROUTINE CHEEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
IB = ILAENV2STAGE( 2, 'CHETRD_2STAGE', JOBZ, N, KD, -1, -1 )
LHTRD = ILAENV2STAGE( 3, 'CHETRD_2STAGE', JOBZ, N, KD, IB, -1 )
LWTRD = ILAENV2STAGE( 4, 'CHETRD_2STAGE', JOBZ, N, KD, IB, -1 )
- LWMIN = N + LHTRD + LWTRD
- LRWMIN = MAX( 1, 24*N )
- LIWMIN = MAX( 1, 10*N )
+*
+ IF( N.LE.1 ) THEN
+ LWMIN = 1
+ LRWMIN = 1
+ LIWMIN = 1
+ ELSE
+ LWMIN = N + LHTRD + LWTRD
+ LRWMIN = 24*N
+ LIWMIN = 10*N
+ END IF
*
INFO = 0
IF( .NOT.( LSAME( JOBZ, 'N' ) ) ) THEN
@@ -506,8 +517,8 @@ SUBROUTINE CHEEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
END IF
*
IF( INFO.EQ.0 ) THEN
- WORK( 1 ) = LWMIN
- RWORK( 1 ) = LRWMIN
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
+ RWORK( 1 ) = SROUNDUP_LWORK( LRWMIN )
IWORK( 1 ) = LIWMIN
*
IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
@@ -535,7 +546,7 @@ SUBROUTINE CHEEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
END IF
*
IF( N.EQ.1 ) THEN
- WORK( 1 ) = 2
+ WORK( 1 ) = 1
IF( ALLEIG .OR. INDEIG ) THEN
M = 1
W( 1 ) = REAL( A( 1, 1 ) )
@@ -643,9 +654,9 @@ SUBROUTINE CHEEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
*
* Call CHETRD_2STAGE to reduce Hermitian matrix to tridiagonal form.
*
- CALL CHETRD_2STAGE( JOBZ, UPLO, N, A, LDA, RWORK( INDRD ),
+ CALL CHETRD_2STAGE( JOBZ, UPLO, N, A, LDA, RWORK( INDRD ),
$ RWORK( INDRE ), WORK( INDTAU ),
- $ WORK( INDHOUS ), LHTRD,
+ $ WORK( INDHOUS ), LHTRD,
$ WORK( INDWK ), LLWORK, IINFO )
*
* If all eigenvalues are desired
@@ -666,7 +677,7 @@ SUBROUTINE CHEEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
CALL SCOPY( N-1, RWORK( INDRE ), 1, RWORK( INDREE ), 1 )
CALL SCOPY( N, RWORK( INDRD ), 1, RWORK( INDRDD ), 1 )
*
- IF (ABSTOL .LE. TWO*N*EPS) THEN
+ IF ( ABSTOL .LE. TWO*N*EPS ) THEN
TRYRAC = .TRUE.
ELSE
TRYRAC = .FALSE.
@@ -765,8 +776,8 @@ SUBROUTINE CHEEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
*
* Set WORK(1) to optimal workspace size.
*
- WORK( 1 ) = LWMIN
- RWORK( 1 ) = LRWMIN
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
+ RWORK( 1 ) = SROUNDUP_LWORK( LRWMIN )
IWORK( 1 ) = LIWMIN
*
RETURN
diff --git a/lapack-netlib/SRC/cheevx.f b/lapack-netlib/SRC/cheevx.f
index e91599a44e..a8a2bde630 100644
--- a/lapack-netlib/SRC/cheevx.f
+++ b/lapack-netlib/SRC/cheevx.f
@@ -348,14 +348,14 @@ SUBROUTINE CHEEVX( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
IF( INFO.EQ.0 ) THEN
IF( N.LE.1 ) THEN
LWKMIN = 1
- WORK( 1 ) = LWKMIN
+ LWKOPT = 1
ELSE
LWKMIN = 2*N
NB = ILAENV( 1, 'CHETRD', UPLO, N, -1, -1, -1 )
NB = MAX( NB, ILAENV( 1, 'CUNMTR', UPLO, N, -1, -1, -1 ) )
- LWKOPT = MAX( 1, ( NB + 1 )*N )
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ LWKOPT = ( NB + 1 )*N
END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY )
$ INFO = -17
diff --git a/lapack-netlib/SRC/chesv_aa.f b/lapack-netlib/SRC/chesv_aa.f
index 53ecc0a165..0f41c93321 100644
--- a/lapack-netlib/SRC/chesv_aa.f
+++ b/lapack-netlib/SRC/chesv_aa.f
@@ -177,7 +177,7 @@ SUBROUTINE CHESV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
*
* .. Local Scalars ..
LOGICAL LQUERY
- INTEGER LWKOPT, LWKOPT_HETRF, LWKOPT_HETRS
+ INTEGER LWKMIN, LWKOPT, LWKOPT_HETRF, LWKOPT_HETRS
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -197,6 +197,7 @@ SUBROUTINE CHESV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
*
INFO = 0
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 2*N, 3*N-2 )
IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -207,18 +208,18 @@ SUBROUTINE CHESV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
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
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -10
END IF
*
IF( INFO.EQ.0 ) THEN
CALL CHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, -1, INFO )
- LWKOPT_HETRF = INT( WORK(1) )
+ LWKOPT_HETRF = INT( WORK( 1 ) )
CALL CHETRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
$ -1, INFO )
- LWKOPT_HETRS = INT( WORK(1) )
- LWKOPT = MAX( LWKOPT_HETRF, LWKOPT_HETRS )
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ LWKOPT_HETRS = INT( WORK( 1 ) )
+ LWKOPT = MAX( LWKMIN, LWKOPT_HETRF, LWKOPT_HETRS )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -240,7 +241,7 @@ SUBROUTINE CHESV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
*
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/chesv_aa_2stage.f b/lapack-netlib/SRC/chesv_aa_2stage.f
index 12950c4af8..05ebd9253a 100644
--- a/lapack-netlib/SRC/chesv_aa_2stage.f
+++ b/lapack-netlib/SRC/chesv_aa_2stage.f
@@ -99,14 +99,14 @@
*>
*> \param[out] TB
*> \verbatim
-*> TB is COMPLEX array, dimension (LTB)
+*> TB is COMPLEX array, dimension (MAX(1,LTB)).
*> On exit, details of the LU factorization of the band matrix.
*> \endverbatim
*>
*> \param[in] LTB
*> \verbatim
*> LTB is INTEGER
-*> The size of the array TB. LTB >= 4*N, internally
+*> The size of the array TB. LTB >= MAX(1,4*N), internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*> If LTB = -1, then a workspace query is assumed; the
@@ -146,14 +146,15 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX workspace of size LWORK
+*> WORK is COMPLEX workspace of size (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The size of WORK. LWORK >= N, internally used to select NB
-*> such that LWORK >= N*NB.
+*> The size of WORK. LWORK >= MAX(1,N), internally used to
+*> select NB such that LWORK >= N*NB.
*>
*> If LWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal size of the WORK array,
@@ -203,7 +204,7 @@ SUBROUTINE CHESV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
*
* .. Local Scalars ..
LOGICAL UPPER, TQUERY, WQUERY
- INTEGER LWKOPT
+ INTEGER LWKMIN, LWKOPT
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -225,6 +226,7 @@ SUBROUTINE CHESV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
UPPER = LSAME( UPLO, 'U' )
WQUERY = ( LWORK.EQ.-1 )
TQUERY = ( LTB.EQ.-1 )
+ LWKMIN = MAX( 1, N )
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -233,18 +235,19 @@ SUBROUTINE CHESV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
INFO = -3
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -5
- ELSE IF( LTB.LT.( 4*N ) .AND. .NOT.TQUERY ) THEN
+ ELSE IF( LTB.LT.MAX( 1, 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
+ ELSE IF( LWORK.LT.LWKMIN .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) )
+ LWKOPT = MAX( LWKMIN, INT( WORK( 1 ) ) )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -254,7 +257,6 @@ SUBROUTINE CHESV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
RETURN
END IF
*
-*
* Compute the factorization A = U**H*T*U or A = L*T*L**H.
*
CALL CHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV, IPIV2,
@@ -268,7 +270,7 @@ SUBROUTINE CHESV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
*
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/chesvx.f b/lapack-netlib/SRC/chesvx.f
index c23a35ce72..bdaad55ec1 100644
--- a/lapack-netlib/SRC/chesvx.f
+++ b/lapack-netlib/SRC/chesvx.f
@@ -307,7 +307,7 @@ SUBROUTINE CHESVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, NOFACT
- INTEGER LWKOPT, NB
+ INTEGER LWKMIN, LWKOPT, NB
REAL ANORM
* ..
* .. External Functions ..
@@ -329,6 +329,7 @@ SUBROUTINE CHESVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
INFO = 0
NOFACT = LSAME( FACT, 'N' )
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 2*N )
IF( .NOT.NOFACT .AND. .NOT.LSAME( FACT, 'F' ) ) THEN
INFO = -1
ELSE IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) )
@@ -346,17 +347,17 @@ SUBROUTINE CHESVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
INFO = -11
ELSE IF( LDX.LT.MAX( 1, N ) ) THEN
INFO = -13
- ELSE IF( LWORK.LT.MAX( 1, 2*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -18
END IF
*
IF( INFO.EQ.0 ) THEN
- LWKOPT = MAX( 1, 2*N )
+ LWKOPT = LWKMIN
IF( NOFACT ) THEN
NB = ILAENV( 1, 'CHETRF', UPLO, N, -1, -1, -1 )
LWKOPT = MAX( LWKOPT, N*NB )
END IF
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -405,7 +406,7 @@ SUBROUTINE CHESVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
IF( RCOND.LT.SLAMCH( 'Epsilon' ) )
$ INFO = N + 1
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/chetrd_2stage.f b/lapack-netlib/SRC/chetrd_2stage.f
index f5ad35f277..ec70757980 100644
--- a/lapack-netlib/SRC/chetrd_2stage.f
+++ b/lapack-netlib/SRC/chetrd_2stage.f
@@ -4,23 +4,23 @@
*
* =========== DOCUMENTATION ===========
*
-* Online html documentation available at
-* http://www.netlib.org/lapack/explore-html/
+* Online html documentation available at
+* http://www.netlib.org/lapack/explore-html/
*
*> \htmlonly
-*> Download CHETRD_2STAGE + dependencies
-*>
-*> [TGZ]
-*>
-*> [ZIP]
-*>
+*> Download CHETRD_2STAGE + dependencies
+*>
+*> [TGZ]
+*>
+*> [ZIP]
+*>
*> [TXT]
-*> \endhtmlonly
+*> \endhtmlonly
*
* Definition:
* ===========
*
-* SUBROUTINE CHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
+* SUBROUTINE CHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
* HOUS2, LHOUS2, WORK, LWORK, INFO )
*
* IMPLICIT NONE
@@ -34,7 +34,7 @@
* COMPLEX A( LDA, * ), TAU( * ),
* HOUS2( * ), WORK( * )
* ..
-*
+*
*
*> \par Purpose:
* =============
@@ -52,11 +52,11 @@
*> \param[in] VECT
*> \verbatim
*> VECT is CHARACTER*1
-*> = 'N': No need for the Housholder representation,
+*> = 'N': No need for the Housholder representation,
*> in particular for the second stage (Band to
*> tridiagonal) and thus LHOUS2 is of size max(1, 4*N);
-*> = 'V': the Householder representation is needed to
-*> either generate Q1 Q2 or to apply Q1 Q2,
+*> = 'V': the Householder representation is needed to
+*> either generate Q1 Q2 or to apply Q1 Q2,
*> then LHOUS2 is to be queried and computed.
*> (NOT AVAILABLE IN THIS RELEASE).
*> \endverbatim
@@ -86,7 +86,7 @@
*> triangular part of A is not referenced.
*> On exit, if UPLO = 'U', the band superdiagonal
*> of A are overwritten by the corresponding elements of the
-*> internal band-diagonal matrix AB, and the elements above
+*> internal band-diagonal matrix AB, and the elements above
*> the KD superdiagonal, with the array TAU, represent the unitary
*> matrix Q1 as a product of elementary reflectors; if UPLO
*> = 'L', the diagonal and band subdiagonal of A are over-
@@ -117,13 +117,13 @@
*> \param[out] TAU
*> \verbatim
*> TAU is COMPLEX array, dimension (N-KD)
-*> The scalar factors of the elementary reflectors of
+*> The scalar factors of the elementary reflectors of
*> the first stage (see Further Details).
*> \endverbatim
*>
*> \param[out] HOUS2
*> \verbatim
-*> HOUS2 is COMPLEX array, dimension (LHOUS2)
+*> HOUS2 is COMPLEX array, dimension (MAX(1,LHOUS2))
*> Stores the Householder representation of the stage2
*> band to tridiagonal.
*> \endverbatim
@@ -132,6 +132,8 @@
*> \verbatim
*> LHOUS2 is INTEGER
*> The dimension of the array HOUS2.
+*> LHOUS2 >= 1.
+*>
*> If LWORK = -1, or LHOUS2=-1,
*> then a query is assumed; the routine
*> only calculates the optimal size of the HOUS2 array, returns
@@ -143,13 +145,16 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX array, dimension (LWORK)
+*> WORK is COMPLEX array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK = MAX(1, dimension)
+*> The dimension of the array WORK.
+*> If N = 0, LWORK >= 1, else LWORK = MAX(1, dimension).
+*>
*> If LWORK = -1, or LHOUS2 = -1,
*> then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -157,9 +162,9 @@
*> message related to LWORK is issued by XERBLA.
*> LWORK = MAX(1, dimension) where
*> dimension = max(stage1,stage2) + (KD+1)*N
-*> = N*KD + N*max(KD+1,FACTOPTNB)
-*> + max(2*KD*KD, KD*NTHREADS)
-*> + (KD+1)*N
+*> = N*KD + N*max(KD+1,FACTOPTNB)
+*> + max(2*KD*KD, KD*NTHREADS)
+*> + (KD+1)*N
*> where KD is the blocking size of the reduction,
*> FACTOPTNB is the blocking used by the QR or LQ
*> algorithm, usually FACTOPTNB=128 is a good choice
@@ -177,12 +182,12 @@
* Authors:
* ========
*
-*> \author Univ. of Tennessee
-*> \author Univ. of California Berkeley
-*> \author Univ. of Colorado Denver
-*> \author NAG Ltd.
+*> \author Univ. of Tennessee
+*> \author Univ. of California Berkeley
+*> \author Univ. of Colorado Denver
+*> \author NAG Ltd.
*
-*> \ingroup complexHEcomputational
+*> \ingroup hetrd_2stage
*
*> \par Further Details:
* =====================
@@ -202,7 +207,7 @@
*> http://doi.acm.org/10.1145/2063384.2063394
*>
*> A. Haidar, J. Kurzak, P. Luszczek, 2013.
-*> An improved parallel singular value algorithm and its implementation
+*> An improved parallel singular value algorithm and its implementation
*> for multicore hardware, In Proceedings of 2013 International Conference
*> for High Performance Computing, Networking, Storage and Analysis (SC '13).
*> Denver, Colorado, USA, 2013.
@@ -210,16 +215,16 @@
*> http://doi.acm.org/10.1145/2503210.2503292
*>
*> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
-*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
+*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
*> calculations based on fine-grained memory aware tasks.
*> International Journal of High Performance Computing Applications.
*> Volume 28 Issue 2, Pages 196-209, May 2014.
-*> http://hpc.sagepub.com/content/28/2/196
+*> http://hpc.sagepub.com/content/28/2/196
*>
*> \endverbatim
*>
* =====================================================================
- SUBROUTINE CHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
+ SUBROUTINE CHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
$ HOUS2, LHOUS2, WORK, LWORK, INFO )
*
IMPLICIT NONE
@@ -250,7 +255,8 @@ SUBROUTINE CHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
* .. External Functions ..
LOGICAL LSAME
INTEGER ILAENV2STAGE
- EXTERNAL LSAME, ILAENV2STAGE
+ REAL SROUNDUP_LWORK
+ EXTERNAL LSAME, ILAENV2STAGE, SROUNDUP_LWORK
* ..
* .. Executable Statements ..
*
@@ -265,10 +271,13 @@ SUBROUTINE CHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
*
KD = ILAENV2STAGE( 1, 'CHETRD_2STAGE', VECT, N, -1, -1, -1 )
IB = ILAENV2STAGE( 2, 'CHETRD_2STAGE', VECT, N, KD, -1, -1 )
- LHMIN = ILAENV2STAGE( 3, 'CHETRD_2STAGE', VECT, N, KD, IB, -1 )
- LWMIN = ILAENV2STAGE( 4, 'CHETRD_2STAGE', VECT, N, KD, IB, -1 )
-* WRITE(*,*),'CHETRD_2STAGE N KD UPLO LHMIN LWMIN ',N, KD, UPLO,
-* $ LHMIN, LWMIN
+ IF( N.EQ.0 ) THEN
+ LHMIN = 1
+ LWMIN = 1
+ ELSE
+ LHMIN = ILAENV2STAGE( 3, 'CHETRD_2STAGE', VECT, N, KD, IB, -1 )
+ LWMIN = ILAENV2STAGE( 4, 'CHETRD_2STAGE', VECT, N, KD, IB, -1 )
+ END IF
*
IF( .NOT.LSAME( VECT, 'N' ) ) THEN
INFO = -1
@@ -285,8 +294,8 @@ SUBROUTINE CHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
END IF
*
IF( INFO.EQ.0 ) THEN
- HOUS2( 1 ) = LHMIN
- WORK( 1 ) = LWMIN
+ HOUS2( 1 ) = SROUNDUP_LWORK( LHMIN )
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -309,14 +318,14 @@ SUBROUTINE CHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
LWRK = LWORK-LDAB*N
ABPOS = 1
WPOS = ABPOS + LDAB*N
- CALL CHETRD_HE2HB( UPLO, N, KD, A, LDA, WORK( ABPOS ), LDAB,
+ CALL CHETRD_HE2HB( UPLO, N, KD, A, LDA, WORK( ABPOS ), LDAB,
$ TAU, WORK( WPOS ), LWRK, INFO )
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'CHETRD_HE2HB', -INFO )
RETURN
END IF
- CALL CHETRD_HB2ST( 'Y', VECT, UPLO, N, KD,
- $ WORK( ABPOS ), LDAB, D, E,
+ CALL CHETRD_HB2ST( 'Y', VECT, UPLO, N, KD,
+ $ WORK( ABPOS ), LDAB, D, E,
$ HOUS2, LHOUS2, WORK( WPOS ), LWRK, INFO )
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'CHETRD_HB2ST', -INFO )
@@ -324,8 +333,7 @@ SUBROUTINE CHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
END IF
*
*
- HOUS2( 1 ) = LHMIN
- WORK( 1 ) = LWMIN
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of CHETRD_2STAGE
diff --git a/lapack-netlib/SRC/chetrd_hb2st.F b/lapack-netlib/SRC/chetrd_hb2st.F
index 3688e40a3d..b0d3e45fbf 100644
--- a/lapack-netlib/SRC/chetrd_hb2st.F
+++ b/lapack-netlib/SRC/chetrd_hb2st.F
@@ -132,15 +132,17 @@
*>
*> \param[out] HOUS
*> \verbatim
-*> HOUS is COMPLEX array, dimension LHOUS, that
-*> store the Householder representation.
+*> HOUS is COMPLEX array, dimension (MAX(1,LHOUS))
+*> Stores the Householder representation.
*> \endverbatim
*>
*> \param[in] LHOUS
*> \verbatim
*> LHOUS is INTEGER
-*> The dimension of the array HOUS. LHOUS = MAX(1, dimension)
-*> If LWORK = -1, or LHOUS=-1,
+*> The dimension of the array HOUS.
+*> If N = 0 or KD <= 1, LHOUS >= 1, else LHOUS = MAX(1, dimension).
+*>
+*> If LWORK = -1, or LHOUS = -1,
*> then a query is assumed; the routine
*> only calculates the optimal size of the HOUS array, returns
*> this value as the first entry of the HOUS array, and no error
@@ -152,14 +154,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX array, dimension LWORK.
+*> WORK is COMPLEX array, dimension (MAX(1,LWORK)).
+*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK = MAX(1, dimension)
-*> If LWORK = -1, or LHOUS=-1,
+*> The dimension of the array WORK.
+*> If N = 0 or KD <= 1, LWORK >= 1, else LWORK = MAX(1, dimension).
+*>
+*> If LWORK = -1, or LHOUS = -1,
*> then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
@@ -262,7 +267,7 @@ SUBROUTINE CHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
INTEGER I, M, K, IB, SWEEPID, MYID, SHIFT, STT, ST,
$ ED, STIND, EDIND, BLKLASTIND, COLPT, THED,
$ STEPERCOL, GRSIZ, THGRSIZ, THGRNB, THGRID,
- $ NBTILES, TTYPE, TID, NTHREADS, DEBUG,
+ $ NBTILES, TTYPE, TID, NTHREADS,
$ ABDPOS, ABOFDPOS, DPOS, OFDPOS, AWPOS,
$ INDA, INDW, APOS, SIZEA, LDA, INDV, INDTAU,
$ SICEV, SIZETAU, LDV, LHMIN, LWMIN
@@ -286,7 +291,6 @@ SUBROUTINE CHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
* Determine the minimal workspace size required.
* Test the input parameters
*
- DEBUG = 0
INFO = 0
AFTERS1 = LSAME( STAGE1, 'Y' )
WANTQ = LSAME( VECT, 'V' )
@@ -295,9 +299,14 @@ SUBROUTINE CHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
*
* Determine the block size, the workspace size and the hous size.
*
- IB = ILAENV2STAGE( 2, 'CHETRD_HB2ST', VECT, N, KD, -1, -1 )
- LHMIN = ILAENV2STAGE( 3, 'CHETRD_HB2ST', VECT, N, KD, IB, -1 )
- LWMIN = ILAENV2STAGE( 4, 'CHETRD_HB2ST', VECT, N, KD, IB, -1 )
+ IB = ILAENV2STAGE( 2, 'CHETRD_HB2ST', VECT, N, KD, -1, -1 )
+ IF( N.EQ.0 .OR. KD.LE.1 ) THEN
+ LHMIN = 1
+ LWMIN = 1
+ ELSE
+ LHMIN = ILAENV2STAGE( 3, 'CHETRD_HB2ST', VECT, N, KD, IB, -1 )
+ LWMIN = ILAENV2STAGE( 4, 'CHETRD_HB2ST', VECT, N, KD, IB, -1 )
+ END IF
*
IF( .NOT.AFTERS1 .AND. .NOT.LSAME( STAGE1, 'N' ) ) THEN
INFO = -1
@@ -318,8 +327,8 @@ SUBROUTINE CHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
END IF
*
IF( INFO.EQ.0 ) THEN
- HOUS( 1 ) = LHMIN
- WORK( 1 ) = SROUNDUP_LWORK(LWMIN)
+ HOUS( 1 ) = SROUNDUP_LWORK( LHMIN )
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -575,8 +584,7 @@ SUBROUTINE CHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
170 CONTINUE
ENDIF
*
- HOUS( 1 ) = LHMIN
- WORK( 1 ) = SROUNDUP_LWORK(LWMIN)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of CHETRD_HB2ST
diff --git a/lapack-netlib/SRC/chetrd_he2hb.f b/lapack-netlib/SRC/chetrd_he2hb.f
index 090f021009..42e71e0b20 100644
--- a/lapack-netlib/SRC/chetrd_he2hb.f
+++ b/lapack-netlib/SRC/chetrd_he2hb.f
@@ -123,8 +123,8 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX array, dimension (LWORK)
-*> On exit, if INFO = 0, or if LWORK=-1,
+*> WORK is COMPLEX array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, or if LWORK = -1,
*> WORK(1) returns the size of LWORK.
*> \endverbatim
*>
@@ -132,7 +132,9 @@
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK which should be calculated
-*> by a workspace query. LWORK = MAX(1, LWORK_QUERY)
+*> by a workspace query.
+*> If N <= KD+1, LWORK >= 1, else LWORK = MAX(1, LWORK_QUERY).
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
@@ -294,8 +296,12 @@ SUBROUTINE CHETRD_HE2HB( UPLO, N, KD, A, LDA, AB, LDAB, TAU,
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
- LWMIN = ILAENV2STAGE( 4, 'CHETRD_HE2HB', '', N, KD, -1, -1 )
-
+ IF( N.LE.KD+1 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = ILAENV2STAGE( 4, 'CHETRD_HE2HB', '', N, KD, -1, -1 )
+ END IF
+*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -314,7 +320,7 @@ SUBROUTINE CHETRD_HE2HB( UPLO, N, KD, A, LDA, AB, LDAB, TAU,
CALL XERBLA( 'CHETRD_HE2HB', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- WORK( 1 ) = SROUNDUP_LWORK(LWMIN)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
END IF
*
@@ -507,7 +513,7 @@ SUBROUTINE CHETRD_HE2HB( UPLO, N, KD, A, LDA, AB, LDAB, TAU,
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(LWMIN)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of CHETRD_HE2HB
diff --git a/lapack-netlib/SRC/chetrf.f b/lapack-netlib/SRC/chetrf.f
index 0c596ffe7c..2836e30bcc 100644
--- a/lapack-netlib/SRC/chetrf.f
+++ b/lapack-netlib/SRC/chetrf.f
@@ -107,7 +107,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >=1. For best performance
+*> The length of WORK. LWORK >= 1. For best performance
*> LWORK >= N*NB, where NB is the block size returned by ILAENV.
*> \endverbatim
*>
@@ -228,8 +228,8 @@ SUBROUTINE CHETRF( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
* Determine the block size
*
NB = ILAENV( 1, 'CHETRF', UPLO, N, -1, -1, -1 )
- LWKOPT = N*NB
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ LWKOPT = MAX( 1, N*NB )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -347,7 +347,7 @@ SUBROUTINE CHETRF( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
END IF
*
40 CONTINUE
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
*
* End of CHETRF
diff --git a/lapack-netlib/SRC/chetrf_aa.f b/lapack-netlib/SRC/chetrf_aa.f
index 0547a4eab3..51410a6ed7 100644
--- a/lapack-netlib/SRC/chetrf_aa.f
+++ b/lapack-netlib/SRC/chetrf_aa.f
@@ -101,8 +101,10 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >= 2*N. For optimum performance
-*> LWORK >= N*(1+NB), where NB is the optimal blocksize.
+*> The length of WORK.
+*> LWORK >= 1, if N <= 1, and LWORK >= 2*N, otherwise.
+*> For optimum performance LWORK >= N*(1+NB), where NB is
+*> the optimal blocksize, returned by ILAENV.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -128,7 +130,7 @@
*> \ingroup hetrf_aa
*
* =====================================================================
- SUBROUTINE CHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
+ SUBROUTINE CHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
@@ -152,7 +154,7 @@ SUBROUTINE CHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
*
* .. Local Scalars ..
LOGICAL LQUERY, UPPER
- INTEGER J, LWKOPT
+ INTEGER J, LWKMIN, LWKOPT
INTEGER NB, MJ, NJ, K1, K2, J1, J2, J3, JB
COMPLEX ALPHA
* ..
@@ -179,19 +181,26 @@ SUBROUTINE CHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
+ IF( N.LE.1 ) THEN
+ LWKMIN = 1
+ LWKOPT = 1
+ ELSE
+ LWKMIN = 2*N
+ LWKOPT = (NB+1)*N
+ END IF
+*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.( 2*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -7
END IF
*
IF( INFO.EQ.0 ) THEN
- LWKOPT = (NB+1)*N
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -203,11 +212,11 @@ SUBROUTINE CHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
*
* Quick return
*
- IF ( N.EQ.0 ) THEN
+ IF( N.EQ.0 ) THEN
RETURN
ENDIF
IPIV( 1 ) = 1
- IF ( N.EQ.1 ) THEN
+ IF( N.EQ.1 ) THEN
A( 1, 1 ) = REAL( A( 1, 1 ) )
RETURN
END IF
@@ -460,7 +469,7 @@ SUBROUTINE CHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
END IF
*
20 CONTINUE
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
*
* End of CHETRF_AA
diff --git a/lapack-netlib/SRC/chetrf_aa_2stage.f b/lapack-netlib/SRC/chetrf_aa_2stage.f
index 400efdf261..a79343753b 100644
--- a/lapack-netlib/SRC/chetrf_aa_2stage.f
+++ b/lapack-netlib/SRC/chetrf_aa_2stage.f
@@ -87,14 +87,14 @@
*>
*> \param[out] TB
*> \verbatim
-*> TB is COMPLEX array, dimension (LTB)
+*> TB is COMPLEX array, dimension (MAX(1,LTB))
*> On exit, details of the LU factorization of the band matrix.
*> \endverbatim
*>
*> \param[in] LTB
*> \verbatim
*> LTB is INTEGER
-*> The size of the array TB. LTB >= 4*N, internally
+*> The size of the array TB. LTB >= MAX(1,4*N), internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*> If LTB = -1, then a workspace query is assumed; the
@@ -121,14 +121,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX workspace of size LWORK
+*> WORK is COMPLEX workspace of size (MAX(1,LWORK))
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The size of WORK. LWORK >= N, internally used to select NB
-*> such that LWORK >= N*NB.
+*> The size of WORK. LWORK >= MAX(1,N), internally used
+*> to select NB such that LWORK >= N*NB.
*>
*> If LWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal size of the WORK array,
@@ -152,7 +152,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complexSYcomputational
+*> \ingroup hetrf_aa_2stage
*
* =====================================================================
SUBROUTINE CHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
@@ -188,7 +188,8 @@ SUBROUTINE CHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
* .. External Functions ..
LOGICAL LSAME
INTEGER ILAENV
- EXTERNAL LSAME, ILAENV
+ REAL SROUNDUP_LWORK
+ EXTERNAL LSAME, ILAENV, SROUNDUP_LWORK
* ..
* .. External Subroutines ..
@@ -213,9 +214,9 @@ SUBROUTINE CHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF ( LTB .LT. 4*N .AND. .NOT.TQUERY ) THEN
+ ELSE IF( LTB.LT.MAX( 1, 4*N ) .AND. .NOT.TQUERY ) THEN
INFO = -6
- ELSE IF ( LWORK .LT. N .AND. .NOT.WQUERY ) THEN
+ ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.WQUERY ) THEN
INFO = -10
END IF
*
@@ -229,10 +230,10 @@ SUBROUTINE CHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
NB = ILAENV( 1, 'CHETRF_AA_2STAGE', UPLO, N, -1, -1, -1 )
IF( INFO.EQ.0 ) THEN
IF( TQUERY ) THEN
- TB( 1 ) = (3*NB+1)*N
+ TB( 1 ) = SROUNDUP_LWORK( MAX( 1, (3*NB+1)*N ) )
END IF
IF( WQUERY ) THEN
- WORK( 1 ) = N*NB
+ WORK( 1 ) = SROUNDUP_LWORK( MAX( 1, N*NB ) )
END IF
END IF
IF( TQUERY .OR. WQUERY ) THEN
@@ -241,7 +242,7 @@ SUBROUTINE CHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
*
* Quick return
*
- IF ( N.EQ.0 ) THEN
+ IF( N.EQ.0 ) THEN
RETURN
ENDIF
*
diff --git a/lapack-netlib/SRC/chetrf_rk.f b/lapack-netlib/SRC/chetrf_rk.f
index ef442c9378..a13c740e3c 100644
--- a/lapack-netlib/SRC/chetrf_rk.f
+++ b/lapack-netlib/SRC/chetrf_rk.f
@@ -177,14 +177,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX array, dimension ( MAX(1,LWORK) ).
+*> WORK is COMPLEX array, dimension (MAX(1,LWORK)).
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >=1. For best performance
+*> The length of WORK. LWORK >= 1. For best performance
*> LWORK >= N*NB, where NB is the block size returned
*> by ILAENV.
*>
@@ -311,8 +311,8 @@ SUBROUTINE CHETRF_RK( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
* Determine the block size
*
NB = ILAENV( 1, 'CHETRF_RK', UPLO, N, -1, -1, -1 )
- LWKOPT = N*NB
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ LWKOPT = MAX( 1, N*NB )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -488,7 +488,7 @@ SUBROUTINE CHETRF_RK( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
*
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
*
* End of CHETRF_RK
diff --git a/lapack-netlib/SRC/chetrf_rook.f b/lapack-netlib/SRC/chetrf_rook.f
index 1593c2edca..df0323520b 100644
--- a/lapack-netlib/SRC/chetrf_rook.f
+++ b/lapack-netlib/SRC/chetrf_rook.f
@@ -122,7 +122,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >=1. For best performance
+*> The length of WORK. LWORK >= 1. For best performance
*> LWORK >= N*NB, where NB is the block size returned by ILAENV.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
@@ -264,7 +264,7 @@ SUBROUTINE CHETRF_ROOK( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
*
NB = ILAENV( 1, 'CHETRF_ROOK', UPLO, N, -1, -1, -1 )
LWKOPT = MAX( 1, N*NB )
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -387,7 +387,7 @@ SUBROUTINE CHETRF_ROOK( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
END IF
*
40 CONTINUE
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
*
* End of CHETRF_ROOK
diff --git a/lapack-netlib/SRC/chetri2.f b/lapack-netlib/SRC/chetri2.f
index 2865a6440f..f15065ae7d 100644
--- a/lapack-netlib/SRC/chetri2.f
+++ b/lapack-netlib/SRC/chetri2.f
@@ -88,16 +88,16 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX array, dimension (N+NB+1)*(NB+3)
+*> WORK is COMPLEX array, dimension (MAX(1,LWORK))
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*> WORK is size >= (N+NB+1)*(NB+3)
+*> If N = 0, LWORK >= 1, else LWORK >= (N+NB+1)*(NB+3).
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> calculates:
+*> 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 LWORK is issued by XERBLA.
@@ -120,7 +120,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complexHEcomputational
+*> \ingroup hetri2
*
* =====================================================================
SUBROUTINE CHETRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
@@ -147,7 +147,8 @@ SUBROUTINE CHETRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
* .. External Functions ..
LOGICAL LSAME
INTEGER ILAENV
- EXTERNAL LSAME, ILAENV
+ REAL SROUNDUP_LWORK
+ EXTERNAL LSAME, ILAENV, SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL CHETRI2X, CHETRI, XERBLA
@@ -159,9 +160,13 @@ SUBROUTINE CHETRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
+*
* Get blocksize
+*
NBMAX = ILAENV( 1, 'CHETRF', UPLO, N, -1, -1, -1 )
- IF ( NBMAX .GE. N ) THEN
+ IF( N.EQ.0 ) THEN
+ MINSIZE = 1
+ ELSE IF( NBMAX.GE.N ) THEN
MINSIZE = N
ELSE
MINSIZE = (N+NBMAX+1)*(NBMAX+3)
@@ -173,28 +178,29 @@ SUBROUTINE CHETRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF (LWORK .LT. MINSIZE .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.MINSIZE .AND. .NOT.LQUERY ) THEN
INFO = -7
END IF
-*
-* Quick return if possible
-*
*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'CHETRI2', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- WORK(1)=MINSIZE
+ WORK( 1 ) = SROUNDUP_LWORK( MINSIZE )
RETURN
END IF
+*
+* Quick return if possible
+*
IF( N.EQ.0 )
$ RETURN
- IF( NBMAX .GE. N ) THEN
+ IF( NBMAX.GE.N ) THEN
CALL CHETRI( UPLO, N, A, LDA, IPIV, WORK, INFO )
ELSE
CALL CHETRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO )
END IF
+*
RETURN
*
* End of CHETRI2
diff --git a/lapack-netlib/SRC/chetri_3.f b/lapack-netlib/SRC/chetri_3.f
index deda635983..ccfce5070b 100644
--- a/lapack-netlib/SRC/chetri_3.f
+++ b/lapack-netlib/SRC/chetri_3.f
@@ -119,16 +119,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX array, dimension (N+NB+1)*(NB+3).
+*> WORK is COMPLEX array, dimension (MAX(1,LWORK)).
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >= (N+NB+1)*(NB+3).
+*> The length of WORK.
+*> If N = 0, LWORK >= 1, else LWORK >= (N+NB+1)*(NB+3).
*>
-*> If LDWORK = -1, then a workspace query is assumed;
+*> If LWORK = -1, then a workspace query is assumed;
*> the routine only calculates the optimal size of the optimal
*> size of the WORK array, returns this value as the first
*> entry of the WORK array, and no error message related to
@@ -209,8 +210,13 @@ SUBROUTINE CHETRI_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
*
* Determine the block size
*
- NB = MAX( 1, ILAENV( 1, 'CHETRI_3', UPLO, N, -1, -1, -1 ) )
- LWKOPT = ( N+NB+1 ) * ( NB+3 )
+ IF( N.EQ.0 ) THEN
+ LWKOPT = 1
+ ELSE
+ NB = MAX( 1, ILAENV( 1, 'CHETRI_3', UPLO, N, -1, -1, -1 ) )
+ LWKOPT = ( N+NB+1 ) * ( NB+3 )
+ END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
@@ -218,7 +224,7 @@ SUBROUTINE CHETRI_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF ( LWORK .LT. LWKOPT .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKOPT .AND. .NOT.LQUERY ) THEN
INFO = -8
END IF
*
@@ -226,7 +232,6 @@ SUBROUTINE CHETRI_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
CALL XERBLA( 'CHETRI_3', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
RETURN
END IF
*
@@ -237,7 +242,7 @@ SUBROUTINE CHETRI_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
*
CALL CHETRI_3X( UPLO, N, A, LDA, E, IPIV, WORK, NB, INFO )
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/chetrs_aa.f b/lapack-netlib/SRC/chetrs_aa.f
index 8795491064..07179ab923 100644
--- a/lapack-netlib/SRC/chetrs_aa.f
+++ b/lapack-netlib/SRC/chetrs_aa.f
@@ -105,7 +105,13 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,3*N-2).
+*> The dimension of the array WORK.
+*> If MIN(N,NRHS) = 0, LWORK >= 1, else LWORK >= 3*N-2.
+*>
+*> If LWORK = -1, then a workspace query is assumed; the routine
+*> only calculates the minimal size of the WORK array, returns
+*> this value as the first entry of the WORK array, and no error
+*> message related to LWORK is issued by XERBLA.
*> \endverbatim
*>
*> \param[out] INFO
@@ -151,24 +157,30 @@ SUBROUTINE CHETRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, UPPER
- INTEGER K, KP, LWKOPT
+ INTEGER K, KP, LWKMIN
* ..
* .. External Functions ..
LOGICAL LSAME
REAL SROUNDUP_LWORK
- EXTERNAL LSAME,SROUNDUP_LWORK
+ EXTERNAL LSAME, SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL CLACPY, CLACGV, CGTSV, CSWAP, CTRSM, XERBLA
* ..
* .. Intrinsic Functions ..
- INTRINSIC MAX
+ INTRINSIC MIN, MAX
* ..
* .. Executable Statements ..
*
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
+ IF( MIN( N, NRHS ).EQ.0 ) THEN
+ LWKMIN = 1
+ ELSE
+ LWKMIN = 3*N-2
+ END IF
+*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -179,21 +191,20 @@ SUBROUTINE CHETRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
INFO = -5
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -8
- ELSE IF( LWORK.LT.MAX( 1, 3*N-2 ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -10
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'CHETRS_AA', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- LWKOPT = (3*N-2)
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKMIN )
RETURN
END IF
*
* Quick return if possible
*
- IF( N.EQ.0 .OR. NRHS.EQ.0 )
+ IF( MIN( N, NRHS ).EQ.0 )
$ RETURN
*
IF( UPPER ) THEN
diff --git a/lapack-netlib/SRC/clamswlq.f b/lapack-netlib/SRC/clamswlq.f
index 5daf60bf67..8f474a3abb 100644
--- a/lapack-netlib/SRC/clamswlq.f
+++ b/lapack-netlib/SRC/clamswlq.f
@@ -127,17 +127,20 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
+*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*> If SIDE = 'L', LWORK >= max(1,NB) * MB;
-*> if SIDE = 'R', LWORK >= max(1,M) * MB.
+*> If MIN(M,N,K) = 0, LWORK >= 1.
+*> If SIDE = 'L', LWORK >= max(1,NB*MB).
+*> If SIDE = 'R', LWORK >= max(1,M*MB).
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
*> \endverbatim
@@ -193,91 +196,100 @@
*>
* =====================================================================
SUBROUTINE CLAMSWLQ( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
- $ LDT, C, LDC, WORK, LWORK, INFO )
+ $ LDT, C, LDC, WORK, LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*
* .. Scalar Arguments ..
- CHARACTER SIDE, TRANS
- INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
+ CHARACTER SIDE, TRANS
+ INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
* ..
* .. Array Arguments ..
- COMPLEX A( LDA, * ), WORK( * ), C(LDC, * ),
- $ T( LDT, * )
+ COMPLEX A( LDA, * ), WORK( * ), C( LDC, * ),
+ $ T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER I, II, KK, LW, CTR
+ LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
+ INTEGER I, II, KK, LW, CTR, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
REAL SROUNDUP_LWORK
EXTERNAL LSAME, SROUNDUP_LWORK
+* ..
* .. External Subroutines ..
- EXTERNAL CTPMLQT, CGEMLQT, XERBLA
+ EXTERNAL CTPMLQT, CGEMLQT, XERBLA
* ..
* .. Executable Statements ..
*
* Test the input arguments
*
- LQUERY = LWORK.LT.0
+ INFO = 0
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'C' )
LEFT = LSAME( SIDE, 'L' )
RIGHT = LSAME( SIDE, 'R' )
- IF (LEFT) THEN
+ IF( LEFT ) THEN
LW = N * MB
ELSE
LW = M * MB
END IF
*
- INFO = 0
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
+*
IF( .NOT.LEFT .AND. .NOT.RIGHT ) THEN
- INFO = -1
+ INFO = -1
ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN
- INFO = -2
+ INFO = -2
ELSE IF( K.LT.0 ) THEN
INFO = -5
ELSE IF( M.LT.K ) THEN
INFO = -3
ELSE IF( N.LT.0 ) THEN
INFO = -4
- ELSE IF( K.LT.MB .OR. MB.LT.1) THEN
+ ELSE IF( K.LT.MB .OR. MB.LT.1 ) THEN
INFO = -6
ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
INFO = -9
- ELSE IF( LDT.LT.MAX( 1, MB) ) THEN
+ ELSE IF( LDT.LT.MAX( 1, MB ) ) THEN
INFO = -11
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
- INFO = -13
- ELSE IF(( LWORK.LT.MAX(1,LW)).AND.(.NOT.LQUERY)) THEN
+ INFO = -13
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -15
END IF
*
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
+ END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'CLAMSWLQ', -INFO )
- WORK(1) = SROUNDUP_LWORK(LW)
RETURN
- ELSE IF (LQUERY) THEN
- WORK(1) = SROUNDUP_LWORK(LW)
+ ELSE IF( LQUERY ) THEN
RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N,K).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
*
IF((NB.LE.K).OR.(NB.GE.MAX(M,N,K))) THEN
CALL CGEMLQT( SIDE, TRANS, M, N, K, MB, A, LDA,
- $ T, LDT, C, LDC, WORK, INFO)
+ $ T, LDT, C, LDC, WORK, INFO )
RETURN
END IF
*
@@ -404,7 +416,7 @@ SUBROUTINE CLAMSWLQ( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
*
END IF
*
- WORK(1) = SROUNDUP_LWORK(LW)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of CLAMSWLQ
diff --git a/lapack-netlib/SRC/clamtsqr.f b/lapack-netlib/SRC/clamtsqr.f
index 05021e642b..13625087f0 100644
--- a/lapack-netlib/SRC/clamtsqr.f
+++ b/lapack-netlib/SRC/clamtsqr.f
@@ -128,22 +128,24 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
-*>
+*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
+*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
+*> If MIN(M,N,K) = 0, LWORK >= 1.
+*> If SIDE = 'L', LWORK >= max(1,N*NB).
+*> If SIDE = 'R', LWORK >= max(1,MB*NB).
*>
-*> If SIDE = 'L', LWORK >= max(1,N)*NB;
-*> if SIDE = 'R', LWORK >= max(1,MB)*NB.
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
-*>
*> \endverbatim
+*>
*> \param[out] INFO
*> \verbatim
*> INFO is INTEGER
@@ -195,45 +197,47 @@
*>
* =====================================================================
SUBROUTINE CLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
- $ LDT, C, LDC, WORK, LWORK, INFO )
+ $ LDT, C, LDC, WORK, LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*
* .. Scalar Arguments ..
- CHARACTER SIDE, TRANS
- INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
+ CHARACTER SIDE, TRANS
+ INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
* ..
* .. Array Arguments ..
- COMPLEX A( LDA, * ), WORK( * ), C(LDC, * ),
- $ T( LDT, * )
+ COMPLEX A( LDA, * ), WORK( * ), C( LDC, * ),
+ $ T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER I, II, KK, LW, CTR, Q
+ LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
+ INTEGER I, II, KK, LW, CTR, Q, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
REAL SROUNDUP_LWORK
EXTERNAL LSAME, SROUNDUP_LWORK
+* ..
* .. External Subroutines ..
- EXTERNAL CGEMQRT, CTPMQRT, XERBLA
+ EXTERNAL CGEMQRT, CTPMQRT, XERBLA
* ..
* .. Executable Statements ..
*
* Test the input arguments
*
- LQUERY = LWORK.LT.0
+ INFO = 0
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'C' )
LEFT = LSAME( SIDE, 'L' )
RIGHT = LSAME( SIDE, 'R' )
- IF (LEFT) THEN
+ IF( LEFT ) THEN
LW = N * NB
Q = M
ELSE
@@ -241,11 +245,17 @@ SUBROUTINE CLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
Q = N
END IF
*
- INFO = 0
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
+*
IF( .NOT.LEFT .AND. .NOT.RIGHT ) THEN
- INFO = -1
+ INFO = -1
ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN
- INFO = -2
+ INFO = -2
ELSE IF( M.LT.K ) THEN
INFO = -3
ELSE IF( N.LT.0 ) THEN
@@ -256,38 +266,38 @@ SUBROUTINE CLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
INFO = -7
ELSE IF( LDA.LT.MAX( 1, Q ) ) THEN
INFO = -9
- ELSE IF( LDT.LT.MAX( 1, NB) ) THEN
+ ELSE IF( LDT.LT.MAX( 1, NB ) ) THEN
INFO = -11
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
- INFO = -13
- ELSE IF(( LWORK.LT.MAX(1,LW)).AND.(.NOT.LQUERY)) THEN
+ INFO = -13
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -15
END IF
*
-* Determine the block size if it is tall skinny or short and wide
-*
- IF( INFO.EQ.0) THEN
- WORK(1) = SROUNDUP_LWORK(LW)
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'CLAMTSQR', -INFO )
RETURN
- ELSE IF (LQUERY) THEN
- RETURN
+ ELSE IF( LQUERY ) THEN
+ RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N,K).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
+*
+* Determine the block size if it is tall skinny or short and wide
*
IF((MB.LE.K).OR.(MB.GE.MAX(M,N,K))) THEN
CALL CGEMQRT( SIDE, TRANS, M, N, K, NB, A, LDA,
- $ T, LDT, C, LDC, WORK, INFO)
+ $ T, LDT, C, LDC, WORK, INFO )
RETURN
- END IF
+ END IF
*
IF(LEFT.AND.NOTRAN) THEN
*
@@ -412,7 +422,7 @@ SUBROUTINE CLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
*
END IF
*
- WORK(1) = SROUNDUP_LWORK(LW)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of CLAMTSQR
diff --git a/lapack-netlib/SRC/claswlq.f b/lapack-netlib/SRC/claswlq.f
index 12e8373df9..2044e055cc 100644
--- a/lapack-netlib/SRC/claswlq.f
+++ b/lapack-netlib/SRC/claswlq.f
@@ -96,22 +96,24 @@
*> The leading dimension of the array T. LDT >= MB.
*> \endverbatim
*>
-*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
-*>
+*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
+*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= MB*M.
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MB*M, otherwise.
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
-*>
*> \endverbatim
+*>
*> \param[out] INFO
*> \verbatim
*> INFO is INTEGER
@@ -163,33 +165,35 @@
*>
* =====================================================================
SUBROUTINE CLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
- $ INFO)
+ $ INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. --
*
* .. Scalar Arguments ..
- INTEGER INFO, LDA, M, N, MB, NB, LWORK, LDT
+ INTEGER INFO, LDA, M, N, MB, NB, LWORK, LDT
* ..
* .. Array Arguments ..
- COMPLEX A( LDA, * ), WORK( * ), T( LDT, *)
+ COMPLEX A( LDA, * ), WORK( * ), T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LQUERY
- INTEGER I, II, KK, CTR
+ LOGICAL LQUERY
+ INTEGER I, II, KK, CTR, MINMN, LWMIN
* ..
* .. EXTERNAL FUNCTIONS ..
LOGICAL LSAME
INTEGER ILAENV
REAL SROUNDUP_LWORK
EXTERNAL LSAME, ILAENV, SROUNDUP_LWORK
+* ..
* .. EXTERNAL SUBROUTINES ..
EXTERNAL CGELQT, CTPLQT, XERBLA
+* ..
* .. INTRINSIC FUNCTIONS ..
INTRINSIC MAX, MIN, MOD
* ..
@@ -200,12 +204,19 @@ SUBROUTINE CLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
INFO = 0
*
LQUERY = ( LWORK.EQ.-1 )
+*
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = M*MB
+ END IF
*
IF( M.LT.0 ) THEN
INFO = -1
ELSE IF( N.LT.0 .OR. N.LT.M ) THEN
INFO = -2
- ELSE IF( MB.LT.1 .OR. ( MB.GT.M .AND. M.GT.0 )) THEN
+ ELSE IF( MB.LT.1 .OR. ( MB.GT.M .AND. M.GT.0 ) ) THEN
INFO = -3
ELSE IF( NB.LE.0 ) THEN
INFO = -4
@@ -213,60 +224,61 @@ SUBROUTINE CLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
INFO = -6
ELSE IF( LDT.LT.MB ) THEN
INFO = -8
- ELSE IF( ( LWORK.LT.M*MB) .AND. (.NOT.LQUERY) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -10
END IF
- IF( INFO.EQ.0) THEN
- WORK(1) = SROUNDUP_LWORK(MB*M)
+*
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'CLASWLQ', -INFO )
RETURN
- ELSE IF (LQUERY) THEN
- RETURN
+ ELSE IF( LQUERY ) THEN
+ RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N).EQ.0 ) THEN
- RETURN
+ IF( MINMN.EQ.0 ) THEN
+ RETURN
END IF
*
* The LQ Decomposition
*
- IF((M.GE.N).OR.(NB.LE.M).OR.(NB.GE.N)) THEN
+ IF( (M.GE.N) .OR. (NB.LE.M) .OR. (NB.GE.N) ) THEN
CALL CGELQT( M, N, MB, A, LDA, T, LDT, WORK, INFO)
RETURN
- END IF
+ END IF
*
- KK = MOD((N-M),(NB-M))
- II=N-KK+1
+ KK = MOD((N-M),(NB-M))
+ II = N-KK+1
*
-* Compute the LQ factorization of the first block A(1:M,1:NB)
+* Compute the LQ factorization of the first block A(1:M,1:NB)
*
- CALL CGELQT( M, NB, MB, A(1,1), LDA, T, LDT, WORK, INFO)
- CTR = 1
+ CALL CGELQT( M, NB, MB, A(1,1), LDA, T, LDT, WORK, INFO)
+ CTR = 1
*
- DO I = NB+1, II-NB+M , (NB-M)
+ DO I = NB+1, II-NB+M , (NB-M)
*
-* Compute the QR factorization of the current block A(1:M,I:I+NB-M)
+* Compute the QR factorization of the current block A(1:M,I:I+NB-M)
*
- CALL CTPLQT( M, NB-M, 0, MB, A(1,1), LDA, A( 1, I ),
+ CALL CTPLQT( M, NB-M, 0, MB, A(1,1), LDA, A( 1, I ),
$ LDA, T(1,CTR*M+1),
$ LDT, WORK, INFO )
- CTR = CTR + 1
- END DO
+ CTR = CTR + 1
+ END DO
*
* Compute the QR factorization of the last block A(1:M,II:N)
*
- IF (II.LE.N) THEN
+ IF( II.LE.N ) THEN
CALL CTPLQT( M, KK, 0, MB, A(1,1), LDA, A( 1, II ),
$ LDA, T(1,CTR*M+1), LDT,
$ WORK, INFO )
- END IF
+ END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(M * MB)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of CLASWLQ
diff --git a/lapack-netlib/SRC/clatrs3.f b/lapack-netlib/SRC/clatrs3.f
index 0502f6898b..354141a8b1 100644
--- a/lapack-netlib/SRC/clatrs3.f
+++ b/lapack-netlib/SRC/clatrs3.f
@@ -152,13 +152,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is REAL array, dimension (LWORK).
+*> WORK is REAL array, dimension (MAX(1,LWORK)).
*> On exit, if INFO = 0, WORK(1) returns the optimal size of
*> WORK.
*> \endverbatim
*>
*> \param[in] LWORK
+*> \verbatim
*> LWORK is INTEGER
+*> The dimension of the array WORK.
+*>
+*> If MIN(N,NRHS) = 0, LWORK >= 1, else
*> LWORK >= MAX(1, 2*NBA * MAX(NBA, MIN(NRHS, 32)), where
*> NBA = (N + NB - 1)/NB and NB is the optimal block size.
*>
@@ -166,6 +170,7 @@
*> only calculates the optimal dimensions of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
+*> \endverbatim
*>
*> \param[out] INFO
*> \verbatim
@@ -182,7 +187,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleOTHERauxiliary
+*> \ingroup latrs3
*> \par Further Details:
* =====================
* \verbatim
@@ -257,15 +262,16 @@ SUBROUTINE CLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
LOGICAL LQUERY, NOTRAN, NOUNIT, UPPER
INTEGER AWRK, I, IFIRST, IINC, ILAST, II, I1, I2, J,
$ JFIRST, JINC, JLAST, J1, J2, K, KK, K1, K2,
- $ LANRM, LDS, LSCALE, NB, NBA, NBX, RHS
+ $ LANRM, LDS, LSCALE, NB, NBA, NBX, RHS, LWMIN
REAL ANRM, BIGNUM, BNRM, RSCAL, SCAL, SCALOC,
$ SCAMIN, SMLNUM, TMAX
* ..
* .. External Functions ..
LOGICAL LSAME
INTEGER ILAENV
- REAL SLAMCH, CLANGE, SLARMM
- EXTERNAL ILAENV, LSAME, SLAMCH, CLANGE, SLARMM
+ REAL SLAMCH, CLANGE, SLARMM, SROUNDUP_LWORK
+ EXTERNAL ILAENV, LSAME, SLAMCH, CLANGE, SLARMM,
+ $ SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL CLATRS, CSSCAL, XERBLA
@@ -296,15 +302,24 @@ SUBROUTINE CLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
* row. WORK( I + KK * LDS ) is the scale factor of the vector
* segment associated with the I-th block row and the KK-th vector
* in the block column.
+*
LSCALE = NBA * MAX( NBA, MIN( NRHS, NBRHS ) )
LDS = NBA
+*
* The second part stores upper bounds of the triangular A. There are
* a total of NBA x NBA blocks, of which only the upper triangular
* part or the lower triangular part is referenced. The upper bound of
* the block A( I, J ) is stored as WORK( AWRK + I + J * NBA ).
+*
LANRM = NBA * NBA
AWRK = LSCALE
- WORK( 1 ) = LSCALE + LANRM
+*
+ IF( MIN( N, NRHS ).EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = LSCALE + LANRM
+ END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
*
* Test the input parameters.
*
@@ -326,7 +341,7 @@ SUBROUTINE CLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
INFO = -8
ELSE IF( LDX.LT.MAX( 1, N ) ) THEN
INFO = -10
- ELSE IF( .NOT.LQUERY .AND. LWORK.LT.WORK( 1 ) ) THEN
+ ELSE IF( .NOT.LQUERY .AND. LWORK.LT.LWMIN ) THEN
INFO = -14
END IF
IF( INFO.NE.0 ) THEN
@@ -659,6 +674,9 @@ SUBROUTINE CLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
END IF
END DO
END DO
+*
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
+*
RETURN
*
* End of CLATRS3
diff --git a/lapack-netlib/SRC/clatsqr.f b/lapack-netlib/SRC/clatsqr.f
index cd2cb4aa7f..67403693f8 100644
--- a/lapack-netlib/SRC/clatsqr.f
+++ b/lapack-netlib/SRC/clatsqr.f
@@ -101,15 +101,18 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
+*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= NB*N.
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= NB*N, otherwise.
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
*> \endverbatim
@@ -165,32 +168,34 @@
*>
* =====================================================================
SUBROUTINE CLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
- $ LWORK, INFO)
+ $ LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. --
*
* .. Scalar Arguments ..
- INTEGER INFO, LDA, M, N, MB, NB, LDT, LWORK
+ INTEGER INFO, LDA, M, N, MB, NB, LDT, LWORK
* ..
* .. Array Arguments ..
- COMPLEX A( LDA, * ), WORK( * ), T(LDT, *)
+ COMPLEX A( LDA, * ), WORK( * ), T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LQUERY
- INTEGER I, II, KK, CTR
+ LOGICAL LQUERY
+ INTEGER I, II, KK, CTR, LWMIN, MINMN
* ..
* .. EXTERNAL FUNCTIONS ..
LOGICAL LSAME
REAL SROUNDUP_LWORK
EXTERNAL LSAME, SROUNDUP_LWORK
+* ..
* .. EXTERNAL SUBROUTINES ..
- EXTERNAL CGEQRT, CTPQRT, XERBLA
+ EXTERNAL CGEQRT, CTPQRT, XERBLA
+* ..
* .. INTRINSIC FUNCTIONS ..
INTRINSIC MAX, MIN, MOD
* ..
@@ -201,6 +206,13 @@ SUBROUTINE CLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
INFO = 0
*
LQUERY = ( LWORK.EQ.-1 )
+*
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = N*NB
+ END IF
*
IF( M.LT.0 ) THEN
INFO = -1
@@ -208,64 +220,65 @@ SUBROUTINE CLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
INFO = -2
ELSE IF( MB.LT.1 ) THEN
INFO = -3
- ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 )) THEN
+ ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 ) ) THEN
INFO = -4
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -6
ELSE IF( LDT.LT.NB ) THEN
INFO = -8
- ELSE IF( LWORK.LT.(N*NB) .AND. (.NOT.LQUERY) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -10
END IF
- IF( INFO.EQ.0) THEN
- WORK(1) = SROUNDUP_LWORK(NB*N)
+*
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'CLATSQR', -INFO )
RETURN
- ELSE IF (LQUERY) THEN
- RETURN
+ ELSE IF( LQUERY ) THEN
+ RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N).EQ.0 ) THEN
- RETURN
+ IF( MINMN.EQ.0 ) THEN
+ RETURN
END IF
*
* The QR Decomposition
*
- IF ((MB.LE.N).OR.(MB.GE.M)) THEN
- CALL CGEQRT( M, N, NB, A, LDA, T, LDT, WORK, INFO)
- RETURN
- END IF
- KK = MOD((M-N),(MB-N))
- II=M-KK+1
+ IF ( (MB.LE.N) .OR. (MB.GE.M) ) THEN
+ CALL CGEQRT( M, N, NB, A, LDA, T, LDT, WORK, INFO )
+ RETURN
+ END IF
+ KK = MOD((M-N),(MB-N))
+ II = M-KK+1
*
-* Compute the QR factorization of the first block A(1:MB,1:N)
+* Compute the QR factorization of the first block A(1:MB,1:N)
*
- CALL CGEQRT( MB, N, NB, A(1,1), LDA, T, LDT, WORK, INFO )
- CTR = 1
+ CALL CGEQRT( MB, N, NB, A(1,1), LDA, T, LDT, WORK, INFO )
+ CTR = 1
*
- DO I = MB+1, II-MB+N , (MB-N)
+ DO I = MB+1, II-MB+N, (MB-N)
*
-* Compute the QR factorization of the current block A(I:I+MB-N,1:N)
+* Compute the QR factorization of the current block A(I:I+MB-N,1:N)
*
- CALL CTPQRT( MB-N, N, 0, NB, A(1,1), LDA, A( I, 1 ), LDA,
+ CALL CTPQRT( MB-N, N, 0, NB, A(1,1), LDA, A( I, 1 ), LDA,
$ T(1,CTR * N + 1),
- $ LDT, WORK, INFO )
- CTR = CTR + 1
- END DO
+ $ LDT, WORK, INFO )
+ CTR = CTR + 1
+ END DO
*
-* Compute the QR factorization of the last block A(II:M,1:N)
+* Compute the QR factorization of the last block A(II:M,1:N)
*
- IF (II.LE.M) THEN
- CALL CTPQRT( KK, N, 0, NB, A(1,1), LDA, A( II, 1 ), LDA,
+ IF( II.LE.M ) THEN
+ CALL CTPQRT( KK, N, 0, NB, A(1,1), LDA, A( II, 1 ), LDA,
$ T(1, CTR * N + 1), LDT,
- $ WORK, INFO )
- END IF
+ $ WORK, INFO )
+ END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(N*NB)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of CLATSQR
diff --git a/lapack-netlib/SRC/dgebrd.f b/lapack-netlib/SRC/dgebrd.f
index 0f0d1651a7..ac11d48a0b 100644
--- a/lapack-netlib/SRC/dgebrd.f
+++ b/lapack-netlib/SRC/dgebrd.f
@@ -122,7 +122,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of the array WORK. LWORK >= max(1,M,N).
+*> The length of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MAX(M,N), otherwise.
*> For optimum performance LWORK >= (M+N)*NB, where NB
*> is the optimal blocksize.
*>
@@ -147,7 +148,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEcomputational
+*> \ingroup gebrd
*
*> \par Further Details:
* =====================
@@ -223,8 +224,8 @@ SUBROUTINE DGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
* ..
* .. Local Scalars ..
LOGICAL LQUERY
- INTEGER I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB,
- $ NBMIN, NX, WS
+ INTEGER I, IINFO, J, LDWRKX, LDWRKY, LWKMIN, LWKOPT,
+ $ MINMN, NB, NBMIN, NX, WS
* ..
* .. External Subroutines ..
EXTERNAL DGEBD2, DGEMM, DLABRD, XERBLA
@@ -241,9 +242,17 @@ SUBROUTINE DGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
* Test the input parameters
*
INFO = 0
- NB = MAX( 1, ILAENV( 1, 'DGEBRD', ' ', M, N, -1, -1 ) )
- LWKOPT = ( M+N )*NB
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWKMIN = 1
+ LWKOPT = 1
+ ELSE
+ LWKMIN = MAX( M, N )
+ NB = MAX( 1, ILAENV( 1, 'DGEBRD', ' ', M, N, -1, -1 ) )
+ LWKOPT = ( M+N )*NB
+ ENDIF
WORK( 1 ) = DBLE( LWKOPT )
+*
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -251,7 +260,7 @@ SUBROUTINE DGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
INFO = -2
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, M, N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -10
END IF
IF( INFO.LT.0 ) THEN
@@ -263,7 +272,6 @@ SUBROUTINE DGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
*
* Quick return if possible
*
- MINMN = MIN( M, N )
IF( MINMN.EQ.0 ) THEN
WORK( 1 ) = 1
RETURN
@@ -282,7 +290,7 @@ SUBROUTINE DGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
* Determine when to switch from blocked to unblocked code.
*
IF( NX.LT.MINMN ) THEN
- WS = ( M+N )*NB
+ WS = LWKOPT
IF( LWORK.LT.WS ) THEN
*
* Not enough work space for the optimal NB, consider using
diff --git a/lapack-netlib/SRC/dgehrd.f b/lapack-netlib/SRC/dgehrd.f
index a40c61cb6d..d95bbd1827 100644
--- a/lapack-netlib/SRC/dgehrd.f
+++ b/lapack-netlib/SRC/dgehrd.f
@@ -89,7 +89,7 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION array, dimension (LWORK)
+*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
@@ -120,7 +120,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEcomputational
+*> \ingroup gehrd
*
*> \par Further Details:
* =====================
@@ -173,7 +173,7 @@ SUBROUTINE DGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
INTEGER IHI, ILO, INFO, LDA, LWORK, N
* ..
* .. Array Arguments ..
- DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * )
+ DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * )
* ..
*
* =====================================================================
@@ -182,7 +182,7 @@ SUBROUTINE DGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
INTEGER NBMAX, LDT, TSIZE
PARAMETER ( NBMAX = 64, LDT = NBMAX+1,
$ TSIZE = LDT*NBMAX )
- DOUBLE PRECISION ZERO, ONE
+ DOUBLE PRECISION ZERO, ONE
PARAMETER ( ZERO = 0.0D+0,
$ ONE = 1.0D+0 )
* ..
@@ -190,7 +190,7 @@ SUBROUTINE DGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
LOGICAL LQUERY
INTEGER I, IB, IINFO, IWT, J, LDWORK, LWKOPT, NB,
$ NBMIN, NH, NX
- DOUBLE PRECISION EI
+ DOUBLE PRECISION EI
* ..
* .. External Subroutines ..
EXTERNAL DAXPY, DGEHD2, DGEMM, DLAHR2, DLARFB, DTRMM,
@@ -221,12 +221,18 @@ SUBROUTINE DGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
INFO = -8
END IF
*
+ NH = IHI - ILO + 1
IF( INFO.EQ.0 ) THEN
*
* Compute the workspace requirements
*
- NB = MIN( NBMAX, ILAENV( 1, 'DGEHRD', ' ', N, ILO, IHI, -1 ) )
- LWKOPT = N*NB + TSIZE
+ IF( NH.LE.1 ) THEN
+ LWKOPT = 1
+ ELSE
+ NB = MIN( NBMAX, ILAENV( 1, 'DGEHRD', ' ', N, ILO, IHI,
+ $ -1 ) )
+ LWKOPT = N*NB + TSIZE
+ ENDIF
WORK( 1 ) = LWKOPT
END IF
*
@@ -248,7 +254,6 @@ SUBROUTINE DGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
*
* Quick return if possible
*
- NH = IHI - ILO + 1
IF( NH.LE.1 ) THEN
WORK( 1 ) = 1
RETURN
@@ -268,7 +273,7 @@ SUBROUTINE DGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
*
* Determine if workspace is large enough for blocked code
*
- IF( LWORK.LT.N*NB+TSIZE ) THEN
+ IF( LWORK.LT.LWKOPT ) THEN
*
* Not enough workspace to use optimal NB: determine the
* minimum value of NB, and reduce NB or force use of
@@ -344,6 +349,7 @@ SUBROUTINE DGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
* Use unblocked code to reduce the rest of the matrix
*
CALL DGEHD2( N, I, IHI, A, LDA, TAU, WORK, IINFO )
+*
WORK( 1 ) = LWKOPT
*
RETURN
diff --git a/lapack-netlib/SRC/dgelq.f b/lapack-netlib/SRC/dgelq.f
index 013b6c3564..255e8732f2 100644
--- a/lapack-netlib/SRC/dgelq.f
+++ b/lapack-netlib/SRC/dgelq.f
@@ -98,7 +98,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1 or -2, then a workspace query is assumed. The routine
*> only calculates the sizes of the T and WORK arrays, returns these
*> values as the first entries of the T and WORK arrays, and no error
@@ -166,6 +166,8 @@
*> the LQ factorization.
*> \endverbatim
*>
+*> \ingroup gelq
+*>
* =====================================================================
SUBROUTINE DGELQ( M, N, A, LDA, T, TSIZE, WORK, LWORK,
$ INFO )
diff --git a/lapack-netlib/SRC/dgelqf.f b/lapack-netlib/SRC/dgelqf.f
index ed3372f965..f0eb00a55d 100644
--- a/lapack-netlib/SRC/dgelqf.f
+++ b/lapack-netlib/SRC/dgelqf.f
@@ -93,7 +93,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,M).
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M, otherwise.
*> For optimum performance LWORK >= M*NB, where NB is the
*> optimal blocksize.
*>
@@ -118,7 +119,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEcomputational
+*> \ingroup gelqf
*
*> \par Further Details:
* =====================
@@ -174,9 +175,8 @@ SUBROUTINE DGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
* Test the input arguments
*
INFO = 0
+ K = MIN( M, N )
NB = ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 )
- LWKOPT = M*NB
- WORK( 1 ) = LWKOPT
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -184,19 +184,25 @@ SUBROUTINE DGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
INFO = -2
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
- INFO = -7
+ ELSE IF( .NOT.LQUERY ) THEN
+ IF( LWORK.LE.0 .OR. ( N.GT.0 .AND. LWORK.LT.MAX( 1, M ) ) )
+ $ INFO = -7
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'DGELQF', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
+ IF( K.EQ.0 ) THEN
+ LWKOPT = 1
+ ELSE
+ LWKOPT = M*NB
+ END IF
+ WORK( 1 ) = LWKOPT
RETURN
END IF
*
* Quick return if possible
*
- K = MIN( M, N )
IF( K.EQ.0 ) THEN
WORK( 1 ) = 1
RETURN
diff --git a/lapack-netlib/SRC/dgelsd.f b/lapack-netlib/SRC/dgelsd.f
index b1f45a2c6c..7dc564f481 100644
--- a/lapack-netlib/SRC/dgelsd.f
+++ b/lapack-netlib/SRC/dgelsd.f
@@ -188,7 +188,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEsolve
+*> \ingroup gelsd
*
*> \par Contributors:
* ==================
@@ -228,7 +228,7 @@ SUBROUTINE DGELSD( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK,
DOUBLE PRECISION ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM
* ..
* .. External Subroutines ..
- EXTERNAL DGEBRD, DGELQF, DGEQRF, DLABAD, DLACPY, DLALSD,
+ EXTERNAL DGEBRD, DGELQF, DGEQRF, DLACPY, DLALSD,
$ DLASCL, DLASET, DORMBR, DORMLQ, DORMQR, XERBLA
* ..
* .. External Functions ..
@@ -276,7 +276,7 @@ SUBROUTINE DGELSD( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK,
$ LOG( TWO ) ) + 1, 0 )
*
IF( INFO.EQ.0 ) THEN
- MAXWRK = 0
+ MAXWRK = 1
LIWORK = 3*MINMN*NLVL + 11*MINMN
MM = M
IF( M.GE.N .AND. M.GE.MNTHR ) THEN
@@ -372,7 +372,6 @@ SUBROUTINE DGELSD( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK,
SFMIN = DLAMCH( 'S' )
SMLNUM = SFMIN / EPS
BIGNUM = ONE / SMLNUM
- CALL DLABAD( SMLNUM, BIGNUM )
*
* Scale A if max entry outside range [SMLNUM,BIGNUM].
*
diff --git a/lapack-netlib/SRC/dgemlq.f b/lapack-netlib/SRC/dgemlq.f
index 3ba2091054..757683f467 100644
--- a/lapack-netlib/SRC/dgemlq.f
+++ b/lapack-netlib/SRC/dgemlq.f
@@ -111,16 +111,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1, then a workspace query is assumed. The routine
*> only calculates the size of the WORK array, returns this
-*> value as WORK(1), and no error message related to WORK
+*> value as WORK(1), and no error message related to WORK
*> is issued by XERBLA.
*> \endverbatim
*>
@@ -144,7 +145,7 @@
*>
*> \verbatim
*>
-*> These details are particular for this LAPACK implementation. Users should not
+*> These details are particular for this LAPACK implementation. Users should not
*> take them for granted. These details may change in the future, and are not likely
*> true for another LAPACK implementation. These details are relevant if one wants
*> to try to understand the code. They are not part of the interface.
@@ -160,11 +161,13 @@
*> block sizes MB and NB returned by ILAENV, DGELQ will use either
*> DLASWLQ (if the matrix is wide-and-short) or DGELQT to compute
*> the LQ factorization.
-*> This version of DGEMLQ will use either DLAMSWLQ or DGEMLQT to
+*> This version of DGEMLQ will use either DLAMSWLQ or DGEMLQT to
*> multiply matrix Q by another matrix.
*> Further Details in DLAMSWLQ or DGEMLQT.
*> \endverbatim
*>
+*> \ingroup gemlq
+*>
* =====================================================================
SUBROUTINE DGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ C, LDC, WORK, LWORK, INFO )
@@ -186,7 +189,7 @@ SUBROUTINE DGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
* ..
* .. Local Scalars ..
LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER MB, NB, LW, NBLCKS, MN
+ INTEGER MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -202,7 +205,7 @@ SUBROUTINE DGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Test the input arguments
*
- LQUERY = LWORK.EQ.-1
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'T' )
LEFT = LSAME( SIDE, 'L' )
@@ -217,6 +220,13 @@ SUBROUTINE DGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
LW = M * MB
MN = N
END IF
+*
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
*
IF( ( NB.GT.K ) .AND. ( MN.GT.K ) ) THEN
IF( MOD( MN - K, NB - K ) .EQ. 0 ) THEN
@@ -245,12 +255,12 @@ SUBROUTINE DGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
INFO = -9
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
INFO = -11
- ELSE IF( ( LWORK.LT.MAX( 1, LW ) ) .AND. ( .NOT.LQUERY ) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
INFO = -13
END IF
*
IF( INFO.EQ.0 ) THEN
- WORK( 1 ) = LW
+ WORK( 1 ) = LWMIN
END IF
*
IF( INFO.NE.0 ) THEN
@@ -262,7 +272,7 @@ SUBROUTINE DGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Quick return if possible
*
- IF( MIN( M, N, K ).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
*
@@ -275,7 +285,7 @@ SUBROUTINE DGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ MB, C, LDC, WORK, LWORK, INFO )
END IF
*
- WORK( 1 ) = LW
+ WORK( 1 ) = LWMIN
*
RETURN
*
diff --git a/lapack-netlib/SRC/dgemqr.f b/lapack-netlib/SRC/dgemqr.f
index 022cf21e43..6088154837 100644
--- a/lapack-netlib/SRC/dgemqr.f
+++ b/lapack-netlib/SRC/dgemqr.f
@@ -111,16 +111,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1, then a workspace query is assumed. The routine
*> only calculates the size of the WORK array, returns this
-*> value as WORK(1), and no error message related to WORK
+*> value as WORK(1), and no error message related to WORK
*> is issued by XERBLA.
*> \endverbatim
*>
@@ -144,7 +145,7 @@
*>
*> \verbatim
*>
-*> These details are particular for this LAPACK implementation. Users should not
+*> These details are particular for this LAPACK implementation. Users should not
*> take them for granted. These details may change in the future, and are not likely
*> true for another LAPACK implementation. These details are relevant if one wants
*> to try to understand the code. They are not part of the interface.
@@ -160,12 +161,14 @@
*> block sizes MB and NB returned by ILAENV, DGEQR will use either
*> DLATSQR (if the matrix is tall-and-skinny) or DGEQRT to compute
*> the QR factorization.
-*> This version of DGEMQR will use either DLAMTSQR or DGEMQRT to
+*> This version of DGEMQR will use either DLAMTSQR or DGEMQRT to
*> multiply matrix Q by another matrix.
*> Further Details in DLATMSQR or DGEMQRT.
*>
*> \endverbatim
*>
+*> \ingroup gemqr
+*>
* =====================================================================
SUBROUTINE DGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ C, LDC, WORK, LWORK, INFO )
@@ -187,7 +190,7 @@ SUBROUTINE DGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
* ..
* .. Local Scalars ..
LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER MB, NB, LW, NBLCKS, MN
+ INTEGER MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -203,7 +206,7 @@ SUBROUTINE DGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Test the input arguments
*
- LQUERY = LWORK.EQ.-1
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'T' )
LEFT = LSAME( SIDE, 'L' )
@@ -218,6 +221,13 @@ SUBROUTINE DGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
LW = MB * NB
MN = N
END IF
+*
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
*
IF( ( MB.GT.K ) .AND. ( MN.GT.K ) ) THEN
IF( MOD( MN - K, MB - K ).EQ.0 ) THEN
@@ -246,12 +256,12 @@ SUBROUTINE DGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
INFO = -9
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
INFO = -11
- ELSE IF( ( LWORK.LT.MAX( 1, LW ) ) .AND. ( .NOT.LQUERY ) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
INFO = -13
END IF
*
IF( INFO.EQ.0 ) THEN
- WORK( 1 ) = LW
+ WORK( 1 ) = LWMIN
END IF
*
IF( INFO.NE.0 ) THEN
@@ -263,7 +273,7 @@ SUBROUTINE DGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Quick return if possible
*
- IF( MIN( M, N, K ).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
*
@@ -276,7 +286,7 @@ SUBROUTINE DGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ NB, C, LDC, WORK, LWORK, INFO )
END IF
*
- WORK( 1 ) = LW
+ WORK( 1 ) = LWMIN
*
RETURN
*
diff --git a/lapack-netlib/SRC/dgeqlf.f b/lapack-netlib/SRC/dgeqlf.f
index b8ac0b1a0e..a72d9dc766 100644
--- a/lapack-netlib/SRC/dgeqlf.f
+++ b/lapack-netlib/SRC/dgeqlf.f
@@ -88,7 +88,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,N).
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
*> For optimum performance LWORK >= N*NB, where NB is the
*> optimal blocksize.
*>
@@ -113,7 +114,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEcomputational
+*> \ingroup geqlf
*
*> \par Further Details:
* =====================
@@ -188,8 +189,9 @@ SUBROUTINE DGEQLF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
END IF
WORK( 1 ) = LWKOPT
*
- IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
- INFO = -7
+ IF( .NOT.LQUERY ) THEN
+ IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) )
+ $ INFO = -7
END IF
END IF
*
diff --git a/lapack-netlib/SRC/dgeqp3rk.f b/lapack-netlib/SRC/dgeqp3rk.f
index 117a68287f..b8e41b39cd 100644
--- a/lapack-netlib/SRC/dgeqp3rk.f
+++ b/lapack-netlib/SRC/dgeqp3rk.f
@@ -427,7 +427,8 @@
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*. LWORK >= (3*N + NRHS - 1)
+*> LWORK >= 1, if MIN(M,N) = 0, and
+*> LWORK >= (3*N+NRHS-1), otherwise.
*> For optimal performance LWORK >= (2*N + NB*( N+NRHS+1 )),
*> where NB is the optimal block size for DGEQP3RK returned
*> by ILAENV. Minimal block size MINNB=2.
diff --git a/lapack-netlib/SRC/dgeqr.f b/lapack-netlib/SRC/dgeqr.f
index eac8930ce0..6ed8f211f1 100644
--- a/lapack-netlib/SRC/dgeqr.f
+++ b/lapack-netlib/SRC/dgeqr.f
@@ -99,7 +99,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1 or -2, then a workspace query is assumed. The routine
*> only calculates the sizes of the T and WORK arrays, returns these
*> values as the first entries of the T and WORK arrays, and no error
@@ -168,6 +168,8 @@
*>
*> \endverbatim
*>
+*> \ingroup geqr
+*>
* =====================================================================
SUBROUTINE DGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
$ INFO )
@@ -188,7 +190,7 @@ SUBROUTINE DGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, LMINWS, MINT, MINW
- INTEGER MB, NB, MINTSZ, NBLCKS
+ INTEGER MB, NB, MINTSZ, NBLCKS, LWMIN, LWREQ
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -244,8 +246,10 @@ SUBROUTINE DGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
*
* Determine if the workspace size satisfies minimal size
*
+ LWMIN = MAX( 1, N )
+ LWREQ = MAX( 1, N*NB )
LMINWS = .FALSE.
- IF( ( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) .OR. LWORK.LT.NB*N )
+ IF( ( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) .OR. LWORK.LT.LWREQ )
$ .AND. ( LWORK.GE.N ) .AND. ( TSIZE.GE.MINTSZ )
$ .AND. ( .NOT.LQUERY ) ) THEN
IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) ) THEN
@@ -253,7 +257,7 @@ SUBROUTINE DGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
NB = 1
MB = M
END IF
- IF( LWORK.LT.NB*N ) THEN
+ IF( LWORK.LT.LWREQ ) THEN
LMINWS = .TRUE.
NB = 1
END IF
@@ -268,7 +272,7 @@ SUBROUTINE DGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
ELSE IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 )
$ .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
INFO = -6
- ELSE IF( ( LWORK.LT.MAX( 1, N*NB ) ) .AND. ( .NOT.LQUERY )
+ ELSE IF( ( LWORK.LT.LWREQ ) .AND. ( .NOT.LQUERY )
$ .AND. ( .NOT.LMINWS ) ) THEN
INFO = -8
END IF
@@ -282,9 +286,9 @@ SUBROUTINE DGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
T( 2 ) = MB
T( 3 ) = NB
IF( MINW ) THEN
- WORK( 1 ) = MAX( 1, N )
+ WORK( 1 ) = LWMIN
ELSE
- WORK( 1 ) = MAX( 1, NB*N )
+ WORK( 1 ) = LWREQ
END IF
END IF
IF( INFO.NE.0 ) THEN
@@ -309,7 +313,7 @@ SUBROUTINE DGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
$ LWORK, INFO )
END IF
*
- WORK( 1 ) = MAX( 1, NB*N )
+ WORK( 1 ) = LWREQ
*
RETURN
*
diff --git a/lapack-netlib/SRC/dgeqrfp.f b/lapack-netlib/SRC/dgeqrfp.f
index 46d2ee4794..aa757e96cf 100644
--- a/lapack-netlib/SRC/dgeqrfp.f
+++ b/lapack-netlib/SRC/dgeqrfp.f
@@ -97,7 +97,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,N).
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
*> For optimum performance LWORK >= N*NB, where NB is
*> the optimal blocksize.
*>
@@ -122,7 +123,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEcomputational
+*> \ingroup geqrfp
*
*> \par Further Details:
* =====================
@@ -162,8 +163,8 @@ SUBROUTINE DGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
* .. Local Scalars ..
LOGICAL LQUERY
- INTEGER I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
- $ NBMIN, NX
+ INTEGER I, IB, IINFO, IWS, K, LDWORK, LWKMIN, LWKOPT,
+ $ NB, NBMIN, NX
* ..
* .. External Subroutines ..
EXTERNAL DGEQR2P, DLARFB, DLARFT, XERBLA
@@ -181,8 +182,16 @@ SUBROUTINE DGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
INFO = 0
NB = ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
- LWKOPT = N*NB
+ K = MIN( M, N )
+ IF( K.EQ.0 ) THEN
+ LWKMIN = 1
+ LWKOPT = 1
+ ELSE
+ LWKMIN = N
+ LWKOPT = N*NB
+ END IF
WORK( 1 ) = LWKOPT
+*
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -190,7 +199,7 @@ SUBROUTINE DGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
INFO = -2
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -7
END IF
IF( INFO.NE.0 ) THEN
@@ -202,7 +211,6 @@ SUBROUTINE DGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
* Quick return if possible
*
- K = MIN( M, N )
IF( K.EQ.0 ) THEN
WORK( 1 ) = 1
RETURN
@@ -210,7 +218,7 @@ SUBROUTINE DGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
NBMIN = 2
NX = 0
- IWS = N
+ IWS = LWKMIN
IF( NB.GT.1 .AND. NB.LT.K ) THEN
*
* Determine when to cross over from blocked to unblocked code.
diff --git a/lapack-netlib/SRC/dgerqf.f b/lapack-netlib/SRC/dgerqf.f
index cca9d6367b..435239cc79 100644
--- a/lapack-netlib/SRC/dgerqf.f
+++ b/lapack-netlib/SRC/dgerqf.f
@@ -114,7 +114,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEcomputational
+*> \ingroup gerqf
*
*> \par Further Details:
* =====================
@@ -189,7 +189,7 @@ SUBROUTINE DGERQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
END IF
WORK( 1 ) = LWKOPT
*
- IF ( .NOT.LQUERY ) THEN
+ IF( .NOT.LQUERY ) THEN
IF( LWORK.LE.0 .OR. ( N.GT.0 .AND. LWORK.LT.MAX( 1, M ) ) )
$ INFO = -7
END IF
diff --git a/lapack-netlib/SRC/dgesvj.f b/lapack-netlib/SRC/dgesvj.f
index 5fdb21e45c..198bfb0a50 100644
--- a/lapack-netlib/SRC/dgesvj.f
+++ b/lapack-netlib/SRC/dgesvj.f
@@ -208,7 +208,7 @@
*>
*> \param[in,out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION array, dimension (LWORK)
+*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
*> On entry :
*> If JOBU = 'C' :
*> WORK(1) = CTOL, where CTOL defines the threshold for convergence.
@@ -239,7 +239,12 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> length of WORK, WORK >= MAX(6,M+N)
+*> The length of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MAX(6,M+N), otherwise.
+*>
+*> If on entry LWORK = -1, then a workspace query is assumed and
+*> no computation is done; WORK(1) is set to the minial (and optimal)
+*> length of WORK.
*> \endverbatim
*>
*> \param[out] INFO
@@ -260,7 +265,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEcomputational
+*> \ingroup gesvj
*
*> \par Further Details:
* =====================
@@ -365,9 +370,9 @@ SUBROUTINE DGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
$ ISWROT, jbc, jgl, KBL, LKAHEAD, MVL, N2, N34,
$ N4, NBL, NOTROT, p, PSKIPPED, q, ROWSKIP,
- $ SWBAND
- LOGICAL APPLV, GOSCALE, LOWER, LSVEC, NOSCALE, ROTOK,
- $ RSVEC, UCTOL, UPPER
+ $ SWBAND, MINMN, LWMIN
+ LOGICAL APPLV, GOSCALE, LOWER, LQUERY, LSVEC, NOSCALE,
+ $ ROTOK, RSVEC, UCTOL, UPPER
* ..
* .. Local Arrays ..
DOUBLE PRECISION FASTR( 5 )
@@ -408,6 +413,14 @@ SUBROUTINE DGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
UPPER = LSAME( JOBA, 'U' )
LOWER = LSAME( JOBA, 'L' )
*
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 6, M+N )
+ END IF
+*
+ LQUERY = ( LWORK.EQ.-1 )
IF( .NOT.( UPPER .OR. LOWER .OR. LSAME( JOBA, 'G' ) ) ) THEN
INFO = -1
ELSE IF( .NOT.( LSVEC .OR. UCTOL .OR. LSAME( JOBU, 'N' ) ) ) THEN
@@ -427,7 +440,7 @@ SUBROUTINE DGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
INFO = -11
ELSE IF( UCTOL .AND. ( WORK( 1 ).LE.ONE ) ) THEN
INFO = -12
- ELSE IF( LWORK.LT.MAX( M+N, 6 ) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. ( .NOT.LQUERY ) ) THEN
INFO = -13
ELSE
INFO = 0
@@ -437,11 +450,14 @@ SUBROUTINE DGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'DGESVJ', -INFO )
RETURN
+ ELSE IF( LQUERY ) THEN
+ WORK( 1 ) = LWMIN
+ RETURN
END IF
*
* #:) Quick return for void matrix
*
- IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )RETURN
+ IF( MINMN.EQ.0 ) RETURN
*
* Set numerical parameters
* The stopping criterion for Jacobi rotations is
diff --git a/lapack-netlib/SRC/dgetri.f b/lapack-netlib/SRC/dgetri.f
index 92ef90c186..7b5a3a1b6c 100644
--- a/lapack-netlib/SRC/dgetri.f
+++ b/lapack-netlib/SRC/dgetri.f
@@ -107,7 +107,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEcomputational
+*> \ingroup getri
*
* =====================================================================
SUBROUTINE DGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
@@ -151,8 +151,9 @@ SUBROUTINE DGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
*
INFO = 0
NB = ILAENV( 1, 'DGETRI', ' ', N, -1, -1, -1 )
- LWKOPT = N*NB
+ LWKOPT = MAX( 1, N*NB )
WORK( 1 ) = LWKOPT
+*
LQUERY = ( LWORK.EQ.-1 )
IF( N.LT.0 ) THEN
INFO = -1
diff --git a/lapack-netlib/SRC/dgetsls.f b/lapack-netlib/SRC/dgetsls.f
index 25f4c12c29..73b505ff7e 100644
--- a/lapack-netlib/SRC/dgetsls.f
+++ b/lapack-netlib/SRC/dgetsls.f
@@ -127,7 +127,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1 or -2, then a workspace query is assumed.
*> If LWORK = -1, the routine calculates optimal size of WORK for the
*> optimal performance and returns this value in WORK(1).
@@ -154,7 +154,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEsolve
+*> \ingroup getsls
*
* =====================================================================
SUBROUTINE DGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
@@ -189,7 +189,7 @@ SUBROUTINE DGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
* .. External Functions ..
LOGICAL LSAME
DOUBLE PRECISION DLAMCH, DLANGE
- EXTERNAL LSAME, DLABAD, DLAMCH, DLANGE
+ EXTERNAL LSAME, DLAMCH, DLANGE
* ..
* .. External Subroutines ..
EXTERNAL DGEQR, DGEMQR, DLASCL, DLASET,
@@ -226,7 +226,10 @@ SUBROUTINE DGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
*
* Determine the optimum and minimum LWORK
*
- IF( M.GE.N ) THEN
+ IF( MIN( M, N, NRHS ).EQ.0 ) THEN
+ WSIZEM = 1
+ WSIZEO = 1
+ ELSE IF( M.GE.N ) THEN
CALL DGEQR( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 )
TSZO = INT( TQ( 1 ) )
LWO = INT( WORKQ( 1 ) )
@@ -294,7 +297,6 @@ SUBROUTINE DGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
*
SMLNUM = DLAMCH( 'S' ) / DLAMCH( 'P' )
BIGNUM = ONE / SMLNUM
- CALL DLABAD( SMLNUM, BIGNUM )
*
* Scale A, B if max element outside range [SMLNUM,BIGNUM]
*
diff --git a/lapack-netlib/SRC/dgetsqrhrt.f b/lapack-netlib/SRC/dgetsqrhrt.f
index 668deeba81..682c7c30fa 100644
--- a/lapack-netlib/SRC/dgetsqrhrt.f
+++ b/lapack-netlib/SRC/dgetsqrhrt.f
@@ -130,14 +130,17 @@
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The dimension of the array WORK.
-*> LWORK >= MAX( LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) ),
+*> If MIN(M,N) = 0, LWORK >= 1, else
+*> LWORK >= MAX( 1, LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) ),
*> where
*> NUM_ALL_ROW_BLOCKS = CEIL((M-N)/(MB1-N)),
*> NB1LOCAL = MIN(NB1,N).
*> LWT = NUM_ALL_ROW_BLOCKS * N * NB1LOCAL,
*> LW1 = NB1LOCAL * N,
-*> LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) ),
+*> LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) ).
+*>
*> If LWORK = -1, then a workspace query is assumed.
*> The routine only calculates the optimal size of the WORK
*> array, returns this value as the first entry of the WORK
@@ -160,7 +163,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleOTHERcomputational
+*> \ingroup getsqrhrt
*
*> \par Contributors:
* ==================
@@ -212,7 +215,7 @@ SUBROUTINE DGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
* Test the input arguments
*
INFO = 0
- LQUERY = LWORK.EQ.-1
+ LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
ELSE IF( N.LT.0 .OR. M.LT.N ) THEN
@@ -225,7 +228,7 @@ SUBROUTINE DGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
INFO = -5
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -7
- ELSE IF( LDT.LT.MAX( 1, MIN( NB2, N ) ) ) THEN
+ ELSE IF( LDT.LT.MAX( 1, MIN( NB2, N ) ) ) THEN
INFO = -9
ELSE
*
@@ -263,8 +266,9 @@ SUBROUTINE DGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) )
*
LWORKOPT = MAX( LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) )
+ LWORKOPT = MAX( 1, LWORKOPT )
*
- IF( ( LWORK.LT.MAX( 1, LWORKOPT ) ).AND.(.NOT.LQUERY) ) THEN
+ IF( LWORK.LT.LWORKOPT .AND. .NOT.LQUERY ) THEN
INFO = -11
END IF
*
@@ -346,4 +350,4 @@ SUBROUTINE DGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
*
* End of DGETSQRHRT
*
- END
\ No newline at end of file
+ END
diff --git a/lapack-netlib/SRC/dgges.f b/lapack-netlib/SRC/dgges.f
index 31db23715d..b9ffc79827 100644
--- a/lapack-netlib/SRC/dgges.f
+++ b/lapack-netlib/SRC/dgges.f
@@ -234,8 +234,8 @@
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*> If N = 0, LWORK >= 1, else LWORK >= 8*N+16.
-*> For good performance , LWORK must generally be larger.
+*> If N = 0, LWORK >= 1, else LWORK >= MAX(8*N,6*N+16).
+*> For good performance, LWORK must generally be larger.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -275,7 +275,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEeigen
+*> \ingroup gges
*
* =====================================================================
SUBROUTINE DGGES( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB,
@@ -321,9 +321,8 @@ SUBROUTINE DGGES( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB,
DOUBLE PRECISION DIF( 2 )
* ..
* .. External Subroutines ..
- EXTERNAL DGEQRF, DGGBAK, DGGBAL, DGGHRD, DHGEQZ, DLABAD,
- $ DLACPY, DLASCL, DLASET, DORGQR, DORMQR, DTGSEN,
- $ XERBLA
+ EXTERNAL DGEQRF, DGGBAK, DGGBAL, DGGHRD, DHGEQZ, DLACPY,
+ $ DLASCL, DLASET, DORGQR, DORMQR, DTGSEN, XERBLA
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -431,7 +430,6 @@ SUBROUTINE DGGES( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB,
EPS = DLAMCH( 'P' )
SAFMIN = DLAMCH( 'S' )
SAFMAX = ONE / SAFMIN
- CALL DLABAD( SAFMIN, SAFMAX )
SMLNUM = SQRT( SAFMIN ) / EPS
BIGNUM = ONE / SMLNUM
*
diff --git a/lapack-netlib/SRC/dgges3.f b/lapack-netlib/SRC/dgges3.f
index 7b00d294af..2ef55951a3 100644
--- a/lapack-netlib/SRC/dgges3.f
+++ b/lapack-netlib/SRC/dgges3.f
@@ -234,6 +234,8 @@
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
+*> If N = 0, LWORK >= 1, else LWORK >= 6*N+16.
+*> For good performance, LWORK must generally be larger.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -273,7 +275,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEeigen
+*> \ingroup gges3
*
* =====================================================================
SUBROUTINE DGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
@@ -309,7 +311,8 @@ SUBROUTINE DGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
$ LQUERY, LST2SL, WANTST
INTEGER I, ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT,
- $ ILO, IP, IRIGHT, IROWS, ITAU, IWRK, LWKOPT
+ $ ILO, IP, IRIGHT, IROWS, ITAU, IWRK, LWKOPT,
+ $ LWKMIN
DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PVSL,
$ PVSR, SAFMAX, SAFMIN, SMLNUM
* ..
@@ -318,9 +321,8 @@ SUBROUTINE DGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
DOUBLE PRECISION DIF( 2 )
* ..
* .. External Subroutines ..
- EXTERNAL DGEQRF, DGGBAK, DGGBAL, DGGHD3, DLAQZ0, DLABAD,
- $ DLACPY, DLASCL, DLASET, DORGQR, DORMQR, DTGSEN,
- $ XERBLA
+ EXTERNAL DGEQRF, DGGBAK, DGGBAL, DGGHD3, DLAQZ0, DLACPY,
+ $ DLASCL, DLASET, DORGQR, DORMQR, DTGSEN, XERBLA
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -362,6 +364,12 @@ SUBROUTINE DGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
*
INFO = 0
LQUERY = ( LWORK.EQ.-1 )
+ IF( N.EQ.0 ) THEN
+ LWKMIN = 1
+ ELSE
+ LWKMIN = 6*N+16
+ END IF
+*
IF( IJOBVL.LE.0 ) THEN
INFO = -1
ELSE IF( IJOBVR.LE.0 ) THEN
@@ -378,7 +386,7 @@ SUBROUTINE DGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
INFO = -15
ELSE IF( LDVSR.LT.1 .OR. ( ILVSR .AND. LDVSR.LT.N ) ) THEN
INFO = -17
- ELSE IF( LWORK.LT.6*N+16 .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -19
END IF
*
@@ -386,29 +394,33 @@ SUBROUTINE DGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
*
IF( INFO.EQ.0 ) THEN
CALL DGEQRF( N, N, B, LDB, WORK, WORK, -1, IERR )
- LWKOPT = MAX( 6*N+16, 3*N+INT( WORK ( 1 ) ) )
+ LWKOPT = MAX( LWKMIN, 3*N+INT( WORK( 1 ) ) )
CALL DORMQR( 'L', 'T', N, N, N, B, LDB, WORK, A, LDA, WORK,
$ -1, IERR )
- LWKOPT = MAX( LWKOPT, 3*N+INT( WORK ( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
IF( ILVSL ) THEN
CALL DORGQR( N, N, N, VSL, LDVSL, WORK, WORK, -1, IERR )
- LWKOPT = MAX( LWKOPT, 3*N+INT( WORK ( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
END IF
CALL DGGHD3( JOBVSL, JOBVSR, N, 1, N, A, LDA, B, LDB, VSL,
$ LDVSL, VSR, LDVSR, WORK, -1, IERR )
- LWKOPT = MAX( LWKOPT, 3*N+INT( WORK ( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
CALL DLAQZ0( 'S', JOBVSL, JOBVSR, N, 1, N, A, LDA, B, LDB,
$ ALPHAR, ALPHAI, BETA, VSL, LDVSL, VSR, LDVSR,
$ WORK, -1, 0, IERR )
- LWKOPT = MAX( LWKOPT, 2*N+INT( WORK ( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 2*N+INT( WORK( 1 ) ) )
IF( WANTST ) THEN
CALL DTGSEN( 0, ILVSL, ILVSR, BWORK, N, A, LDA, B, LDB,
$ ALPHAR, ALPHAI, BETA, VSL, LDVSL, VSR, LDVSR,
$ SDIM, PVSL, PVSR, DIF, WORK, -1, IDUM, 1,
$ IERR )
- LWKOPT = MAX( LWKOPT, 2*N+INT( WORK ( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 2*N+INT( WORK( 1 ) ) )
+ END IF
+ IF( N.EQ.0 ) THEN
+ WORK( 1 ) = 1
+ ELSE
+ WORK( 1 ) = LWKOPT
END IF
- WORK( 1 ) = LWKOPT
END IF
*
IF( INFO.NE.0 ) THEN
@@ -430,7 +442,6 @@ SUBROUTINE DGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
EPS = DLAMCH( 'P' )
SAFMIN = DLAMCH( 'S' )
SAFMAX = ONE / SAFMIN
- CALL DLABAD( SAFMIN, SAFMAX )
SMLNUM = SQRT( SAFMIN ) / EPS
BIGNUM = ONE / SMLNUM
*
diff --git a/lapack-netlib/SRC/dggev3.f b/lapack-netlib/SRC/dggev3.f
index 4bbe8a40f5..b970c04c4e 100644
--- a/lapack-netlib/SRC/dggev3.f
+++ b/lapack-netlib/SRC/dggev3.f
@@ -188,7 +188,9 @@
*>
*> \param[in] LWORK
*> \verbatim
-*> LWORK is INTEGER
+*> LWORK is INTEGER.
+*> The dimension of the array WORK. LWORK >= MAX(1,8*N).
+*> For good performance, LWORK should generally be larger.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -217,7 +219,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEeigen
+*> \ingroup ggev3
*
* =====================================================================
SUBROUTINE DGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
@@ -248,7 +250,8 @@ SUBROUTINE DGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
LOGICAL ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
CHARACTER CHTEMP
INTEGER ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
- $ IN, IRIGHT, IROWS, ITAU, IWRK, JC, JR, LWKOPT
+ $ IN, IRIGHT, IROWS, ITAU, IWRK, JC, JR, LWKOPT,
+ $ LWKMIN
DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
$ SMLNUM, TEMP
* ..
@@ -256,9 +259,8 @@ SUBROUTINE DGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
LOGICAL LDUMMA( 1 )
* ..
* .. External Subroutines ..
- EXTERNAL DGEQRF, DGGBAK, DGGBAL, DGGHD3, DLAQZ0, DLABAD,
- $ DLACPY, DLASCL, DLASET, DORGQR, DORMQR, DTGEVC,
- $ XERBLA
+ EXTERNAL DGEQRF, DGGBAK, DGGBAL, DGGHD3, DLAQZ0, DLACPY,
+ $ DLASCL, DLASET, DORGQR, DORMQR, DTGEVC, XERBLA
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -299,6 +301,7 @@ SUBROUTINE DGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
*
INFO = 0
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 8*N )
IF( IJOBVL.LE.0 ) THEN
INFO = -1
ELSE IF( IJOBVR.LE.0 ) THEN
@@ -313,7 +316,7 @@ SUBROUTINE DGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
INFO = -12
ELSE IF( LDVR.LT.1 .OR. ( ILVR .AND. LDVR.LT.N ) ) THEN
INFO = -14
- ELSE IF( LWORK.LT.MAX( 1, 8*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -16
END IF
*
@@ -321,13 +324,13 @@ SUBROUTINE DGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
*
IF( INFO.EQ.0 ) THEN
CALL DGEQRF( N, N, B, LDB, WORK, WORK, -1, IERR )
- LWKOPT = MAX(1, 8*N, 3*N+INT( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKMIN, 3*N+INT( WORK( 1 ) ) )
CALL DORMQR( 'L', 'T', N, N, N, B, LDB, WORK, A, LDA, WORK, -1,
$ IERR )
- LWKOPT = MAX( LWKOPT, 3*N+INT( WORK ( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
IF( ILVL ) THEN
CALL DORGQR( N, N, N, VL, LDVL, WORK, WORK, -1, IERR )
- LWKOPT = MAX( LWKOPT, 3*N+INT( WORK ( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
END IF
IF( ILV ) THEN
CALL DGGHD3( JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB, VL,
@@ -336,18 +339,21 @@ SUBROUTINE DGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
CALL DLAQZ0( 'S', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB,
$ ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR,
$ WORK, -1, 0, IERR )
- LWKOPT = MAX( LWKOPT, 2*N+INT( WORK ( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 2*N+INT( WORK( 1 ) ) )
ELSE
CALL DGGHD3( 'N', 'N', N, 1, N, A, LDA, B, LDB, VL, LDVL,
$ VR, LDVR, WORK, -1, IERR )
- LWKOPT = MAX( LWKOPT, 3*N+INT( WORK ( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
CALL DLAQZ0( 'E', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB,
$ ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR,
$ WORK, -1, 0, IERR )
- LWKOPT = MAX( LWKOPT, 2*N+INT( WORK ( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 2*N+INT( WORK( 1 ) ) )
+ END IF
+ IF( N.EQ.0 ) THEN
+ WORK( 1 ) = 1
+ ELSE
+ WORK( 1 ) = LWKOPT
END IF
-
- WORK( 1 ) = LWKOPT
END IF
*
IF( INFO.NE.0 ) THEN
@@ -367,7 +373,6 @@ SUBROUTINE DGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
EPS = DLAMCH( 'P' )
SMLNUM = DLAMCH( 'S' )
BIGNUM = ONE / SMLNUM
- CALL DLABAD( SMLNUM, BIGNUM )
SMLNUM = SQRT( SMLNUM ) / EPS
BIGNUM = ONE / SMLNUM
*
diff --git a/lapack-netlib/SRC/dgghd3.f b/lapack-netlib/SRC/dgghd3.f
index 43d7a77df5..21a6685734 100644
--- a/lapack-netlib/SRC/dgghd3.f
+++ b/lapack-netlib/SRC/dgghd3.f
@@ -179,14 +179,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION array, dimension (LWORK)
+*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
-*> \param[in] LWORK
+*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of the array WORK. LWORK >= 1.
+*> The length of the array WORK. LWORK >= 1.
*> For optimum performance LWORK >= 6*N*NB, where NB is the
*> optimal blocksize.
*>
@@ -211,7 +211,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleOTHERcomputational
+*> \ingroup gghd3
*
*> \par Further Details:
* =====================
@@ -275,7 +275,12 @@ SUBROUTINE DGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
*
INFO = 0
NB = ILAENV( 1, 'DGGHD3', ' ', N, ILO, IHI, -1 )
- LWKOPT = MAX( 6*N*NB, 1 )
+ NH = IHI - ILO + 1
+ IF( NH.LE.1 ) THEN
+ LWKOPT = 1
+ ELSE
+ LWKOPT = 6*N*NB
+ END IF
WORK( 1 ) = DBLE( LWKOPT )
INITQ = LSAME( COMPQ, 'I' )
WANTQ = INITQ .OR. LSAME( COMPQ, 'V' )
@@ -325,7 +330,6 @@ SUBROUTINE DGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
*
* Quick return if possible
*
- NH = IHI - ILO + 1
IF( NH.LE.1 ) THEN
WORK( 1 ) = ONE
RETURN
@@ -885,6 +889,7 @@ SUBROUTINE DGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
IF ( JCOL.LT.IHI )
$ CALL DGGHRD( COMPQ2, COMPZ2, N, JCOL, IHI, A, LDA, B, LDB, Q,
$ LDQ, Z, LDZ, IERR )
+*
WORK( 1 ) = DBLE( LWKOPT )
*
RETURN
diff --git a/lapack-netlib/SRC/dggqrf.f b/lapack-netlib/SRC/dggqrf.f
index 39d27a5c93..edac7f22f2 100644
--- a/lapack-netlib/SRC/dggqrf.f
+++ b/lapack-netlib/SRC/dggqrf.f
@@ -173,7 +173,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleOTHERcomputational
+*> \ingroup ggqrf
*
*> \par Further Details:
* =====================
@@ -250,7 +250,7 @@ SUBROUTINE DGGQRF( N, M, P, A, LDA, TAUA, B, LDB, TAUB, WORK,
NB2 = ILAENV( 1, 'DGERQF', ' ', N, P, -1, -1 )
NB3 = ILAENV( 1, 'DORMQR', ' ', N, M, P, -1 )
NB = MAX( NB1, NB2, NB3 )
- LWKOPT = MAX( N, M, P )*NB
+ LWKOPT = MAX( 1, MAX( N, M, P )*NB )
WORK( 1 ) = LWKOPT
LQUERY = ( LWORK.EQ.-1 )
IF( N.LT.0 ) THEN
@@ -287,6 +287,7 @@ SUBROUTINE DGGQRF( N, M, P, A, LDA, TAUA, B, LDB, TAUB, WORK,
* RQ factorization of N-by-P matrix B: B = T*Z.
*
CALL DGERQF( N, P, B, LDB, TAUB, WORK, LWORK, INFO )
+*
WORK( 1 ) = MAX( LOPT, INT( WORK( 1 ) ) )
*
RETURN
diff --git a/lapack-netlib/SRC/dggrqf.f b/lapack-netlib/SRC/dggrqf.f
index ddf4104c59..3b1024c1cd 100644
--- a/lapack-netlib/SRC/dggrqf.f
+++ b/lapack-netlib/SRC/dggrqf.f
@@ -172,7 +172,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleOTHERcomputational
+*> \ingroup ggrqf
*
*> \par Further Details:
* =====================
@@ -249,7 +249,7 @@ SUBROUTINE DGGRQF( M, P, N, A, LDA, TAUA, B, LDB, TAUB, WORK,
NB2 = ILAENV( 1, 'DGEQRF', ' ', P, N, -1, -1 )
NB3 = ILAENV( 1, 'DORMRQ', ' ', M, N, P, -1 )
NB = MAX( NB1, NB2, NB3 )
- LWKOPT = MAX( N, M, P )*NB
+ LWKOPT = MAX( 1, MAX( N, M, P )*NB )
WORK( 1 ) = LWKOPT
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
diff --git a/lapack-netlib/SRC/dggsvd3.f b/lapack-netlib/SRC/dggsvd3.f
index 503f0d8cc7..ee4d11e86f 100644
--- a/lapack-netlib/SRC/dggsvd3.f
+++ b/lapack-netlib/SRC/dggsvd3.f
@@ -278,7 +278,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -328,7 +328,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleGEsing
+*> \ingroup ggsvd3
*
*> \par Contributors:
* ==================
diff --git a/lapack-netlib/SRC/dggsvp3.f b/lapack-netlib/SRC/dggsvp3.f
index 4e1db3117b..485d95b369 100644
--- a/lapack-netlib/SRC/dggsvp3.f
+++ b/lapack-netlib/SRC/dggsvp3.f
@@ -227,7 +227,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -250,7 +250,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleOTHERcomputational
+*> \ingroup ggsvp3
*
*> \par Further Details:
* =====================
diff --git a/lapack-netlib/SRC/dlamswlq.f b/lapack-netlib/SRC/dlamswlq.f
index 70e78f4b19..07ef1bd57d 100644
--- a/lapack-netlib/SRC/dlamswlq.f
+++ b/lapack-netlib/SRC/dlamswlq.f
@@ -127,17 +127,20 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*> If SIDE = 'L', LWORK >= max(1,NB) * MB;
-*> if SIDE = 'R', LWORK >= max(1,M) * MB.
+*>
+*> If MIN(M,N,K) = 0, LWORK >= 1.
+*> If SIDE = 'L', LWORK >= max(1,NB*MB).
+*> If SIDE = 'R', LWORK >= max(1,M*MB).
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
*> \endverbatim
@@ -189,29 +192,31 @@
*> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
*> \endverbatim
*>
+*> \ingroup lamswlq
+*>
* =====================================================================
SUBROUTINE DLAMSWLQ( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
- $ LDT, C, LDC, WORK, LWORK, INFO )
+ $ LDT, C, LDC, WORK, LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*
* .. Scalar Arguments ..
- CHARACTER SIDE, TRANS
- INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
+ CHARACTER SIDE, TRANS
+ INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
* ..
* .. Array Arguments ..
- DOUBLE PRECISION A( LDA, * ), WORK( * ), C(LDC, * ),
- $ T( LDT, * )
+ DOUBLE PRECISION A( LDA, * ), WORK( * ), C( LDC, * ),
+ $ T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER I, II, KK, CTR, LW
+ LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
+ INTEGER I, II, KK, CTR, LW, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -223,52 +228,60 @@ SUBROUTINE DLAMSWLQ( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
*
* Test the input arguments
*
- LQUERY = LWORK.LT.0
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'T' )
LEFT = LSAME( SIDE, 'L' )
RIGHT = LSAME( SIDE, 'R' )
- IF (LEFT) THEN
+ IF( LEFT ) THEN
LW = N * MB
ELSE
LW = M * MB
END IF
+*
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
*
INFO = 0
IF( .NOT.LEFT .AND. .NOT.RIGHT ) THEN
- INFO = -1
+ INFO = -1
ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN
- INFO = -2
+ INFO = -2
ELSE IF( K.LT.0 ) THEN
INFO = -5
ELSE IF( M.LT.K ) THEN
INFO = -3
ELSE IF( N.LT.0 ) THEN
INFO = -4
- ELSE IF( K.LT.MB .OR. MB.LT.1) THEN
+ ELSE IF( K.LT.MB .OR. MB.LT.1 ) THEN
INFO = -6
ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
INFO = -9
- ELSE IF( LDT.LT.MAX( 1, MB) ) THEN
+ ELSE IF( LDT.LT.MAX( 1, MB ) ) THEN
INFO = -11
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
- INFO = -13
- ELSE IF(( LWORK.LT.MAX(1,LW)).AND.(.NOT.LQUERY)) THEN
+ INFO = -13
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -15
END IF
*
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = LWMIN
+ END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'DLAMSWLQ', -INFO )
- WORK(1) = LW
RETURN
- ELSE IF (LQUERY) THEN
- WORK(1) = LW
+ ELSE IF( LQUERY ) THEN
RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N,K).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
*
@@ -402,7 +415,8 @@ SUBROUTINE DLAMSWLQ( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
*
END IF
*
- WORK(1) = LW
+ WORK( 1 ) = LWMIN
+*
RETURN
*
* End of DLAMSWLQ
diff --git a/lapack-netlib/SRC/dlamtsqr.f b/lapack-netlib/SRC/dlamtsqr.f
index 962a314763..023db5ac9b 100644
--- a/lapack-netlib/SRC/dlamtsqr.f
+++ b/lapack-netlib/SRC/dlamtsqr.f
@@ -128,22 +128,24 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*>
+*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
+*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
+*> If MIN(M,N,K) = 0, LWORK >= 1.
+*> If SIDE = 'L', LWORK >= max(1,N*NB).
+*> If SIDE = 'R', LWORK >= max(1,MB*NB).
*>
-*> If SIDE = 'L', LWORK >= max(1,N)*NB;
-*> if SIDE = 'R', LWORK >= max(1,MB)*NB.
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
-*>
*> \endverbatim
+*>
*> \param[out] INFO
*> \verbatim
*> INFO is INTEGER
@@ -191,29 +193,31 @@
*> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
*> \endverbatim
*>
+*> \ingroup lamtsqr
+*>
* =====================================================================
SUBROUTINE DLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
- $ LDT, C, LDC, WORK, LWORK, INFO )
+ $ LDT, C, LDC, WORK, LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*
* .. Scalar Arguments ..
- CHARACTER SIDE, TRANS
- INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
+ CHARACTER SIDE, TRANS
+ INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
* ..
* .. Array Arguments ..
- DOUBLE PRECISION A( LDA, * ), WORK( * ), C(LDC, * ),
- $ T( LDT, * )
+ DOUBLE PRECISION A( LDA, * ), WORK( * ), C( LDC, * ),
+ $ T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER I, II, KK, LW, CTR, Q
+ LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
+ INTEGER I, II, KK, LW, CTR, Q, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -225,12 +229,13 @@ SUBROUTINE DLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
*
* Test the input arguments
*
- LQUERY = LWORK.LT.0
+ INFO = 0
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'T' )
LEFT = LSAME( SIDE, 'L' )
RIGHT = LSAME( SIDE, 'R' )
- IF (LEFT) THEN
+ IF( LEFT ) THEN
LW = N * NB
Q = M
ELSE
@@ -238,11 +243,17 @@ SUBROUTINE DLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
Q = N
END IF
*
- INFO = 0
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
+*
IF( .NOT.LEFT .AND. .NOT.RIGHT ) THEN
- INFO = -1
+ INFO = -1
ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN
- INFO = -2
+ INFO = -2
ELSE IF( M.LT.K ) THEN
INFO = -3
ELSE IF( N.LT.0 ) THEN
@@ -253,38 +264,38 @@ SUBROUTINE DLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
INFO = -7
ELSE IF( LDA.LT.MAX( 1, Q ) ) THEN
INFO = -9
- ELSE IF( LDT.LT.MAX( 1, NB) ) THEN
+ ELSE IF( LDT.LT.MAX( 1, NB ) ) THEN
INFO = -11
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
- INFO = -13
- ELSE IF(( LWORK.LT.MAX(1,LW)).AND.(.NOT.LQUERY)) THEN
+ INFO = -13
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -15
END IF
*
-* Determine the block size if it is tall skinny or short and wide
-*
- IF( INFO.EQ.0) THEN
- WORK(1) = LW
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = LWMIN
END IF
*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'DLAMTSQR', -INFO )
RETURN
- ELSE IF (LQUERY) THEN
- RETURN
+ ELSE IF( LQUERY ) THEN
+ RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N,K).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
+*
+* Determine the block size if it is tall skinny or short and wide
*
IF((MB.LE.K).OR.(MB.GE.MAX(M,N,K))) THEN
CALL DGEMQRT( SIDE, TRANS, M, N, K, NB, A, LDA,
- $ T, LDT, C, LDC, WORK, INFO)
+ $ T, LDT, C, LDC, WORK, INFO )
RETURN
- END IF
+ END IF
*
IF(LEFT.AND.NOTRAN) THEN
*
@@ -410,7 +421,8 @@ SUBROUTINE DLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
*
END IF
*
- WORK(1) = LW
+ WORK( 1 ) = LWMIN
+*
RETURN
*
* End of DLAMTSQR
diff --git a/lapack-netlib/SRC/dlaswlq.f b/lapack-netlib/SRC/dlaswlq.f
index c95c94cbc4..636c12dc87 100644
--- a/lapack-netlib/SRC/dlaswlq.f
+++ b/lapack-netlib/SRC/dlaswlq.f
@@ -99,19 +99,22 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*>
+*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
+*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= MB*M.
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MB*M, otherwise.
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
-*>
*> \endverbatim
+*>
*> \param[out] INFO
*> \verbatim
*> INFO is INTEGER
@@ -159,33 +162,37 @@
*> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
*> \endverbatim
*>
+*> \ingroup laswlq
+*>
* =====================================================================
SUBROUTINE DLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
- $ INFO)
+ $ INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. --
*
* .. Scalar Arguments ..
- INTEGER INFO, LDA, M, N, MB, NB, LWORK, LDT
+ INTEGER INFO, LDA, M, N, MB, NB, LWORK, LDT
* ..
* .. Array Arguments ..
- DOUBLE PRECISION A( LDA, * ), WORK( * ), T( LDT, *)
+ DOUBLE PRECISION A( LDA, * ), WORK( * ), T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LQUERY
- INTEGER I, II, KK, CTR
+ LOGICAL LQUERY
+ INTEGER I, II, KK, CTR, MINMN, LWMIN
* ..
* .. EXTERNAL FUNCTIONS ..
LOGICAL LSAME
EXTERNAL LSAME
+* ..
* .. EXTERNAL SUBROUTINES ..
EXTERNAL DGELQT, DTPLQT, XERBLA
+* ..
* .. INTRINSIC FUNCTIONS ..
INTRINSIC MAX, MIN, MOD
* ..
@@ -196,12 +203,19 @@ SUBROUTINE DLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
INFO = 0
*
LQUERY = ( LWORK.EQ.-1 )
+*
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = M*MB
+ END IF
*
IF( M.LT.0 ) THEN
INFO = -1
ELSE IF( N.LT.0 .OR. N.LT.M ) THEN
INFO = -2
- ELSE IF( MB.LT.1 .OR. ( MB.GT.M .AND. M.GT.0 )) THEN
+ ELSE IF( MB.LT.1 .OR. ( MB.GT.M .AND. M.GT.0 ) ) THEN
INFO = -3
ELSE IF( NB.LT.0 ) THEN
INFO = -4
@@ -209,60 +223,62 @@ SUBROUTINE DLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
INFO = -6
ELSE IF( LDT.LT.MB ) THEN
INFO = -8
- ELSE IF( ( LWORK.LT.M*MB) .AND. (.NOT.LQUERY) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -10
END IF
- IF( INFO.EQ.0) THEN
- WORK(1) = MB*M
+*
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = LWMIN
END IF
*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'DLASWLQ', -INFO )
RETURN
- ELSE IF (LQUERY) THEN
- RETURN
+ ELSE IF( LQUERY ) THEN
+ RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N).EQ.0 ) THEN
- RETURN
+ IF( MINMN.EQ.0 ) THEN
+ RETURN
END IF
*
* The LQ Decomposition
*
- IF((M.GE.N).OR.(NB.LE.M).OR.(NB.GE.N)) THEN
- CALL DGELQT( M, N, MB, A, LDA, T, LDT, WORK, INFO)
+ IF( (M.GE.N) .OR. (NB.LE.M) .OR. (NB.GE.N) ) THEN
+ CALL DGELQT( M, N, MB, A, LDA, T, LDT, WORK, INFO )
RETURN
- END IF
+ END IF
*
- KK = MOD((N-M),(NB-M))
- II=N-KK+1
+ KK = MOD((N-M),(NB-M))
+ II = N-KK+1
*
-* Compute the LQ factorization of the first block A(1:M,1:NB)
+* Compute the LQ factorization of the first block A(1:M,1:NB)
*
- CALL DGELQT( M, NB, MB, A(1,1), LDA, T, LDT, WORK, INFO)
- CTR = 1
+ CALL DGELQT( M, NB, MB, A(1,1), LDA, T, LDT, WORK, INFO )
+ CTR = 1
*
- DO I = NB+1, II-NB+M , (NB-M)
+ DO I = NB+1, II-NB+M, (NB-M)
*
-* Compute the QR factorization of the current block A(1:M,I:I+NB-M)
+* Compute the QR factorization of the current block A(1:M,I:I+NB-M)
*
- CALL DTPLQT( M, NB-M, 0, MB, A(1,1), LDA, A( 1, I ),
- $ LDA, T(1, CTR * M + 1),
- $ LDT, WORK, INFO )
- CTR = CTR + 1
- END DO
+ CALL DTPLQT( M, NB-M, 0, MB, A(1,1), LDA, A( 1, I ),
+ $ LDA, T(1, CTR * M + 1),
+ $ LDT, WORK, INFO )
+ CTR = CTR + 1
+ END DO
*
* Compute the QR factorization of the last block A(1:M,II:N)
*
- IF (II.LE.N) THEN
+ IF( II.LE.N ) THEN
CALL DTPLQT( M, KK, 0, MB, A(1,1), LDA, A( 1, II ),
- $ LDA, T(1, CTR * M + 1), LDT,
- $ WORK, INFO )
- END IF
+ $ LDA, T(1, CTR * M + 1), LDT,
+ $ WORK, INFO )
+ END IF
+*
+ WORK( 1 ) = LWMIN
*
- WORK( 1 ) = M * MB
RETURN
*
* End of DLASWLQ
diff --git a/lapack-netlib/SRC/dlatrs3.f b/lapack-netlib/SRC/dlatrs3.f
index e6d78b672c..d18675b2d0 100644
--- a/lapack-netlib/SRC/dlatrs3.f
+++ b/lapack-netlib/SRC/dlatrs3.f
@@ -151,13 +151,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION array, dimension (LWORK).
+*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)).
*> On exit, if INFO = 0, WORK(1) returns the optimal size of
*> WORK.
*> \endverbatim
*>
*> \param[in] LWORK
+*> \verbatim
*> LWORK is INTEGER
+*> The dimension of the array WORK.
+*>
+*> If MIN(N,NRHS) = 0, LWORK >= 1, else
*> LWORK >= MAX(1, 2*NBA * MAX(NBA, MIN(NRHS, 32)), where
*> NBA = (N + NB - 1)/NB and NB is the optimal block size.
*>
@@ -165,6 +169,7 @@
*> only calculates the optimal dimensions of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
+*> \endverbatim
*>
*> \param[out] INFO
*> \verbatim
@@ -181,7 +186,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleOTHERauxiliary
+*> \ingroup latrs3
*> \par Further Details:
* =====================
* \verbatim
@@ -253,7 +258,7 @@ SUBROUTINE DLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
LOGICAL LQUERY, NOTRAN, NOUNIT, UPPER
INTEGER AWRK, I, IFIRST, IINC, ILAST, II, I1, I2, J,
$ JFIRST, JINC, JLAST, J1, J2, K, KK, K1, K2,
- $ LANRM, LDS, LSCALE, NB, NBA, NBX, RHS
+ $ LANRM, LDS, LSCALE, NB, NBA, NBX, RHS, LWMIN
DOUBLE PRECISION ANRM, BIGNUM, BNRM, RSCAL, SCAL, SCALOC,
$ SCAMIN, SMLNUM, TMAX
* ..
@@ -292,15 +297,24 @@ SUBROUTINE DLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
* row. WORK( I+KK*LDS ) is the scale factor of the vector
* segment associated with the I-th block row and the KK-th vector
* in the block column.
+*
LSCALE = NBA * MAX( NBA, MIN( NRHS, NBRHS ) )
LDS = NBA
+*
* The second part stores upper bounds of the triangular A. There are
* a total of NBA x NBA blocks, of which only the upper triangular
* part or the lower triangular part is referenced. The upper bound of
* the block A( I, J ) is stored as WORK( AWRK + I + J * NBA ).
+*
LANRM = NBA * NBA
AWRK = LSCALE
- WORK( 1 ) = LSCALE + LANRM
+*
+ IF( MIN( N, NRHS ).EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = LSCALE + LANRM
+ END IF
+ WORK( 1 ) = LWMIN
*
* Test the input parameters
*
@@ -322,7 +336,7 @@ SUBROUTINE DLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
INFO = -8
ELSE IF( LDX.LT.MAX( 1, N ) ) THEN
INFO = -10
- ELSE IF( .NOT.LQUERY .AND. LWORK.LT.WORK( 1 ) ) THEN
+ ELSE IF( .NOT.LQUERY .AND. LWORK.LT.LWMIN ) THEN
INFO = -14
END IF
IF( INFO.NE.0 ) THEN
@@ -649,6 +663,9 @@ SUBROUTINE DLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
END IF
END DO
END DO
+*
+ WORK( 1 ) = LWMIN
+*
RETURN
*
* End of DLATRS3
diff --git a/lapack-netlib/SRC/dlatsqr.f b/lapack-netlib/SRC/dlatsqr.f
index 94a04be028..0000aab68c 100644
--- a/lapack-netlib/SRC/dlatsqr.f
+++ b/lapack-netlib/SRC/dlatsqr.f
@@ -101,15 +101,18 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= NB*N.
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= NB*N, otherwise.
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
*> \endverbatim
@@ -161,27 +164,29 @@
*> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
*> \endverbatim
*>
+*> \ingroup latsqr
+*>
* =====================================================================
SUBROUTINE DLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
- $ LWORK, INFO)
+ $ LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. --
*
* .. Scalar Arguments ..
- INTEGER INFO, LDA, M, N, MB, NB, LDT, LWORK
+ INTEGER INFO, LDA, M, N, MB, NB, LDT, LWORK
* ..
* .. Array Arguments ..
- DOUBLE PRECISION A( LDA, * ), WORK( * ), T(LDT, *)
+ DOUBLE PRECISION A( LDA, * ), WORK( * ), T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LQUERY
- INTEGER I, II, KK, CTR
+ LOGICAL LQUERY
+ INTEGER I, II, KK, CTR, MINMN, LWMIN
* ..
* .. EXTERNAL FUNCTIONS ..
LOGICAL LSAME
@@ -198,6 +203,13 @@ SUBROUTINE DLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
INFO = 0
*
LQUERY = ( LWORK.EQ.-1 )
+*
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = N*NB
+ END IF
*
IF( M.LT.0 ) THEN
INFO = -1
@@ -205,65 +217,67 @@ SUBROUTINE DLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
INFO = -2
ELSE IF( MB.LT.1 ) THEN
INFO = -3
- ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 )) THEN
+ ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 ) ) THEN
INFO = -4
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -6
ELSE IF( LDT.LT.NB ) THEN
INFO = -8
- ELSE IF( LWORK.LT.(N*NB) .AND. (.NOT.LQUERY) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -10
END IF
- IF( INFO.EQ.0) THEN
- WORK(1) = NB*N
+*
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = LWMIN
END IF
+*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'DLATSQR', -INFO )
RETURN
- ELSE IF (LQUERY) THEN
- RETURN
+ ELSE IF( LQUERY ) THEN
+ RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N).EQ.0 ) THEN
- RETURN
+ IF( MINMN.EQ.0 ) THEN
+ RETURN
END IF
*
* The QR Decomposition
*
- IF ((MB.LE.N).OR.(MB.GE.M)) THEN
- CALL DGEQRT( M, N, NB, A, LDA, T, LDT, WORK, INFO)
- RETURN
- END IF
+ IF( (MB.LE.N) .OR. (MB.GE.M) ) THEN
+ CALL DGEQRT( M, N, NB, A, LDA, T, LDT, WORK, INFO )
+ RETURN
+ END IF
*
- KK = MOD((M-N),(MB-N))
- II=M-KK+1
+ KK = MOD((M-N),(MB-N))
+ II = M-KK+1
*
-* Compute the QR factorization of the first block A(1:MB,1:N)
+* Compute the QR factorization of the first block A(1:MB,1:N)
*
- CALL DGEQRT( MB, N, NB, A(1,1), LDA, T, LDT, WORK, INFO )
+ CALL DGEQRT( MB, N, NB, A(1,1), LDA, T, LDT, WORK, INFO )
*
- CTR = 1
- DO I = MB+1, II-MB+N , (MB-N)
+ CTR = 1
+ DO I = MB+1, II-MB+N, (MB-N)
*
-* Compute the QR factorization of the current block A(I:I+MB-N,1:N)
+* Compute the QR factorization of the current block A(I:I+MB-N,1:N)
*
- CALL DTPQRT( MB-N, N, 0, NB, A(1,1), LDA, A( I, 1 ), LDA,
- $ T(1, CTR * N + 1),
- $ LDT, WORK, INFO )
- CTR = CTR + 1
- END DO
+ CALL DTPQRT( MB-N, N, 0, NB, A(1,1), LDA, A( I, 1 ), LDA,
+ $ T(1, CTR * N + 1),
+ $ LDT, WORK, INFO )
+ CTR = CTR + 1
+ END DO
*
-* Compute the QR factorization of the last block A(II:M,1:N)
+* Compute the QR factorization of the last block A(II:M,1:N)
*
- IF (II.LE.M) THEN
- CALL DTPQRT( KK, N, 0, NB, A(1,1), LDA, A( II, 1 ), LDA,
- $ T(1, CTR * N + 1), LDT,
- $ WORK, INFO )
- END IF
+ IF( II.LE.M ) THEN
+ CALL DTPQRT( KK, N, 0, NB, A(1,1), LDA, A( II, 1 ), LDA,
+ $ T(1, CTR * N + 1), LDT,
+ $ WORK, INFO )
+ END IF
*
- WORK( 1 ) = N*NB
+ WORK( 1 ) = LWMIN
RETURN
*
* End of DLATSQR
diff --git a/lapack-netlib/SRC/dsyev_2stage.f b/lapack-netlib/SRC/dsyev_2stage.f
index 50d51d992b..286366bfec 100644
--- a/lapack-netlib/SRC/dsyev_2stage.f
+++ b/lapack-netlib/SRC/dsyev_2stage.f
@@ -20,7 +20,7 @@
* Definition:
* ===========
*
-* SUBROUTINE DSYEV_2STAGE( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK,
+* SUBROUTINE DSYEV_2STAGE( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK,
* INFO )
*
* IMPLICIT NONE
@@ -97,7 +97,7 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION array, dimension LWORK
+*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
@@ -105,12 +105,12 @@
*> \verbatim
*> LWORK is INTEGER
*> The length of the array WORK. LWORK >= 1, when N <= 1;
-*> otherwise
+*> otherwise
*> If JOBZ = 'N' and N > 1, LWORK must be queried.
*> LWORK = MAX(1, dimension) where
*> dimension = max(stage1,stage2) + (KD+1)*N + 2*N
-*> = N*KD + N*max(KD+1,FACTOPTNB)
-*> + max(2*KD*KD, KD*NTHREADS)
+*> = N*KD + N*max(KD+1,FACTOPTNB)
+*> + max(2*KD*KD, KD*NTHREADS)
*> + (KD+1)*N + 2*N
*> where KD is the blocking size of the reduction,
*> FACTOPTNB is the blocking used by the QR or LQ
@@ -143,7 +143,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYeigen
+*> \ingroup heev_2stage
*
*> \par Further Details:
* =====================
@@ -161,7 +161,7 @@
*> http://doi.acm.org/10.1145/2063384.2063394
*>
*> A. Haidar, J. Kurzak, P. Luszczek, 2013.
-*> An improved parallel singular value algorithm and its implementation
+*> An improved parallel singular value algorithm and its implementation
*> for multicore hardware, In Proceedings of 2013 International Conference
*> for High Performance Computing, Networking, Storage and Analysis (SC '13).
*> Denver, Colorado, USA, 2013.
@@ -169,16 +169,16 @@
*> http://doi.acm.org/10.1145/2503210.2503292
*>
*> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
-*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
+*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
*> calculations based on fine-grained memory aware tasks.
*> International Journal of High Performance Computing Applications.
*> Volume 28 Issue 2, Pages 196-209, May 2014.
-*> http://hpc.sagepub.com/content/28/2/196
+*> http://hpc.sagepub.com/content/28/2/196
*>
*> \endverbatim
*
* =====================================================================
- SUBROUTINE DSYEV_2STAGE( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK,
+ SUBROUTINE DSYEV_2STAGE( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK,
$ INFO )
*
IMPLICIT NONE
@@ -305,7 +305,7 @@ SUBROUTINE DSYEV_2STAGE( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK,
LLWORK = LWORK - INDWRK + 1
*
CALL DSYTRD_2STAGE( JOBZ, UPLO, N, A, LDA, W, WORK( INDE ),
- $ WORK( INDTAU ), WORK( INDHOUS ), LHTRD,
+ $ WORK( INDTAU ), WORK( INDHOUS ), LHTRD,
$ WORK( INDWRK ), LLWORK, IINFO )
*
* For eigenvalues only, call DSTERF. For eigenvectors, first call
diff --git a/lapack-netlib/SRC/dsyevd.f b/lapack-netlib/SRC/dsyevd.f
index b27f4cdc7a..adcfcb3731 100644
--- a/lapack-netlib/SRC/dsyevd.f
+++ b/lapack-netlib/SRC/dsyevd.f
@@ -96,8 +96,7 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION array,
-*> dimension (LWORK)
+*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
@@ -160,7 +159,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYeigen
+*> \ingroup heevd
*
*> \par Contributors:
* ==================
diff --git a/lapack-netlib/SRC/dsyevr.f b/lapack-netlib/SRC/dsyevr.f
index 698691533f..8647b0162c 100644
--- a/lapack-netlib/SRC/dsyevr.f
+++ b/lapack-netlib/SRC/dsyevr.f
@@ -271,7 +271,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,26*N).
+*> The dimension of the array WORK.
+*> If N <= 1, LWORK >= 1, else LWORK >= 26*N.
*> For optimal efficiency, LWORK >= (NB+6)*N,
*> where NB is the max of the blocksize for DSYTRD and DORMTR
*> returned by ILAENV.
@@ -285,13 +286,14 @@
*> \param[out] IWORK
*> \verbatim
*> IWORK is INTEGER array, dimension (MAX(1,LIWORK))
-*> On exit, if INFO = 0, IWORK(1) returns the optimal LWORK.
+*> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
*> \endverbatim
*>
*> \param[in] LIWORK
*> \verbatim
*> LIWORK is INTEGER
-*> The dimension of the array IWORK. LIWORK >= max(1,10*N).
+*> The dimension of the array IWORK.
+*> If N <= 1, LIWORK >= 1, else LIWORK >= 10*N.
*>
*> If LIWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal size of the IWORK array,
@@ -315,7 +317,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYeigen
+*> \ingroup heevr
*
*> \par Contributors:
* ==================
@@ -390,8 +392,13 @@ SUBROUTINE DSYEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
*
LQUERY = ( ( LWORK.EQ.-1 ) .OR. ( LIWORK.EQ.-1 ) )
*
- LWMIN = MAX( 1, 26*N )
- LIWMIN = MAX( 1, 10*N )
+ IF( N.LE.1 ) THEN
+ LWMIN = 1
+ LIWMIN = 1
+ ELSE
+ LWMIN = 26*N
+ LIWMIN = 10*N
+ END IF
*
INFO = 0
IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
@@ -450,7 +457,7 @@ SUBROUTINE DSYEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
END IF
*
IF( N.EQ.1 ) THEN
- WORK( 1 ) = 7
+ WORK( 1 ) = 1
IF( ALLEIG .OR. INDEIG ) THEN
M = 1
W( 1 ) = A( 1, 1 )
diff --git a/lapack-netlib/SRC/dsyevr_2stage.f b/lapack-netlib/SRC/dsyevr_2stage.f
index 09242bbd31..63d5e31598 100644
--- a/lapack-netlib/SRC/dsyevr_2stage.f
+++ b/lapack-netlib/SRC/dsyevr_2stage.f
@@ -263,7 +263,7 @@
*> indicating the nonzero elements in Z. The i-th eigenvector
*> is nonzero only in elements ISUPPZ( 2*i-1 ) through
*> ISUPPZ( 2*i ). This is an output of DSTEMR (tridiagonal
-*> matrix). The support of the eigenvectors of A is typically
+*> matrix). The support of the eigenvectors of A is typically
*> 1:N because of the orthogonal transformations applied by DORMTR.
*> Implemented only for RANGE = 'A' or 'I' and IU - IL = N - 1
*> \endverbatim
@@ -277,12 +277,13 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK.
+*> If N <= 1, LWORK must be at least 1.
*> If JOBZ = 'N' and N > 1, LWORK must be queried.
*> LWORK = MAX(1, 26*N, dimension) where
*> dimension = max(stage1,stage2) + (KD+1)*N + 5*N
-*> = N*KD + N*max(KD+1,FACTOPTNB)
-*> + max(2*KD*KD, KD*NTHREADS)
+*> = N*KD + N*max(KD+1,FACTOPTNB)
+*> + max(2*KD*KD, KD*NTHREADS)
*> + (KD+1)*N + 5*N
*> where KD is the blocking size of the reduction,
*> FACTOPTNB is the blocking used by the QR or LQ
@@ -300,13 +301,14 @@
*> \param[out] IWORK
*> \verbatim
*> IWORK is INTEGER array, dimension (MAX(1,LIWORK))
-*> On exit, if INFO = 0, IWORK(1) returns the optimal LWORK.
+*> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
*> \endverbatim
*>
*> \param[in] LIWORK
*> \verbatim
*> LIWORK is INTEGER
-*> The dimension of the array IWORK. LIWORK >= max(1,10*N).
+*> The dimension of the array IWORK.
+*> If N <= 1, LIWORK >= 1, else LIWORK >= 10*N.
*>
*> If LIWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal size of the IWORK array,
@@ -330,7 +332,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYeigen
+*> \ingroup heevr_2stage
*
*> \par Contributors:
* ==================
@@ -358,7 +360,7 @@
*> http://doi.acm.org/10.1145/2063384.2063394
*>
*> A. Haidar, J. Kurzak, P. Luszczek, 2013.
-*> An improved parallel singular value algorithm and its implementation
+*> An improved parallel singular value algorithm and its implementation
*> for multicore hardware, In Proceedings of 2013 International Conference
*> for High Performance Computing, Networking, Storage and Analysis (SC '13).
*> Denver, Colorado, USA, 2013.
@@ -366,11 +368,11 @@
*> http://doi.acm.org/10.1145/2503210.2503292
*>
*> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
-*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
+*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
*> calculations based on fine-grained memory aware tasks.
*> International Journal of High Performance Computing Applications.
*> Volume 28 Issue 2, Pages 196-209, May 2014.
-*> http://hpc.sagepub.com/content/28/2/196
+*> http://hpc.sagepub.com/content/28/2/196
*>
*> \endverbatim
*
@@ -444,8 +446,14 @@ SUBROUTINE DSYEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
IB = ILAENV2STAGE( 2, 'DSYTRD_2STAGE', JOBZ, N, KD, -1, -1 )
LHTRD = ILAENV2STAGE( 3, 'DSYTRD_2STAGE', JOBZ, N, KD, IB, -1 )
LWTRD = ILAENV2STAGE( 4, 'DSYTRD_2STAGE', JOBZ, N, KD, IB, -1 )
- LWMIN = MAX( 26*N, 5*N + LHTRD + LWTRD )
- LIWMIN = MAX( 1, 10*N )
+*
+ IF( N.LE.1 ) THEN
+ LWMIN = 1
+ LIWMIN = 1
+ ELSE
+ LWMIN = MAX( 26*N, 5*N + LHTRD + LWTRD )
+ LIWMIN = 10*N
+ END IF
*
INFO = 0
IF( .NOT.( LSAME( JOBZ, 'N' ) ) ) THEN
@@ -484,7 +492,7 @@ SUBROUTINE DSYEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
* NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 )
* NB = MAX( NB, ILAENV( 1, 'DORMTR', UPLO, N, -1, -1, -1 ) )
* LWKOPT = MAX( ( NB+1 )*N, LWMIN )
- WORK( 1 ) = LWMIN
+ WORK( 1 ) = LWMIN
IWORK( 1 ) = LIWMIN
END IF
*
@@ -504,7 +512,7 @@ SUBROUTINE DSYEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
END IF
*
IF( N.EQ.1 ) THEN
- WORK( 1 ) = 7
+ WORK( 1 ) = 1
IF( ALLEIG .OR. INDEIG ) THEN
M = 1
W( 1 ) = A( 1, 1 )
@@ -608,7 +616,7 @@ SUBROUTINE DSYEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
* Call DSYTRD_2STAGE to reduce symmetric matrix to tridiagonal form.
*
*
- CALL DSYTRD_2STAGE( JOBZ, UPLO, N, A, LDA, WORK( INDD ),
+ CALL DSYTRD_2STAGE( JOBZ, UPLO, N, A, LDA, WORK( INDD ),
$ WORK( INDE ), WORK( INDTAU ), WORK( INDHOUS ),
$ LHTRD, WORK( INDWK ), LLWORK, IINFO )
*
@@ -727,7 +735,7 @@ SUBROUTINE DSYEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
*
* Set WORK(1) to optimal workspace size.
*
- WORK( 1 ) = LWMIN
+ WORK( 1 ) = LWMIN
IWORK( 1 ) = LIWMIN
*
RETURN
diff --git a/lapack-netlib/SRC/dsyevx.f b/lapack-netlib/SRC/dsyevx.f
index 99719874b5..fd6a78e320 100644
--- a/lapack-netlib/SRC/dsyevx.f
+++ b/lapack-netlib/SRC/dsyevx.f
@@ -244,7 +244,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYeigen
+*> \ingroup heevx
*
* =====================================================================
SUBROUTINE DSYEVX( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
@@ -338,14 +338,14 @@ SUBROUTINE DSYEVX( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
IF( INFO.EQ.0 ) THEN
IF( N.LE.1 ) THEN
LWKMIN = 1
- WORK( 1 ) = LWKMIN
+ LWKOPT = 1
ELSE
LWKMIN = 8*N
NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 )
NB = MAX( NB, ILAENV( 1, 'DORMTR', UPLO, N, -1, -1, -1 ) )
LWKOPT = MAX( LWKMIN, ( NB + 3 )*N )
- WORK( 1 ) = LWKOPT
END IF
+ WORK( 1 ) = LWKOPT
*
IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY )
$ INFO = -17
diff --git a/lapack-netlib/SRC/dsysv_aa.f b/lapack-netlib/SRC/dsysv_aa.f
index 8dab5a384d..0a96ecd7e5 100644
--- a/lapack-netlib/SRC/dsysv_aa.f
+++ b/lapack-netlib/SRC/dsysv_aa.f
@@ -154,7 +154,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYsolve
+*> \ingroup hesv_aa
*
* =====================================================================
SUBROUTINE DSYSV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
@@ -177,7 +177,7 @@ SUBROUTINE DSYSV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
*
* .. Local Scalars ..
LOGICAL LQUERY
- INTEGER LWKOPT, LWKOPT_SYTRF, LWKOPT_SYTRS
+ INTEGER LWKMIN, LWKOPT, LWKOPT_SYTRF, LWKOPT_SYTRS
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -196,6 +196,7 @@ SUBROUTINE DSYSV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
*
INFO = 0
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 2*N, 3*N-2 )
IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -206,17 +207,17 @@ SUBROUTINE DSYSV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
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
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -10
END IF
*
IF( INFO.EQ.0 ) THEN
CALL DSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, -1, INFO )
- LWKOPT_SYTRF = INT( WORK(1) )
+ LWKOPT_SYTRF = INT( WORK( 1 ) )
CALL DSYTRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
$ -1, INFO )
- LWKOPT_SYTRS = INT( WORK(1) )
- LWKOPT = MAX( LWKOPT_SYTRF, LWKOPT_SYTRS )
+ LWKOPT_SYTRS = INT( WORK( 1 ) )
+ LWKOPT = MAX( LWKMIN, LWKOPT_SYTRF, LWKOPT_SYTRS )
WORK( 1 ) = LWKOPT
END IF
*
diff --git a/lapack-netlib/SRC/dsysv_aa_2stage.f b/lapack-netlib/SRC/dsysv_aa_2stage.f
index 72fbe1e9a8..90dd0a38ae 100644
--- a/lapack-netlib/SRC/dsysv_aa_2stage.f
+++ b/lapack-netlib/SRC/dsysv_aa_2stage.f
@@ -101,14 +101,14 @@
*>
*> \param[out] TB
*> \verbatim
-*> TB is DOUBLE PRECISION array, dimension (LTB)
+*> TB is DOUBLE PRECISION array, dimension (MAX(1,LTB))
*> On exit, details of the LU factorization of the band matrix.
*> \endverbatim
*>
*> \param[in] LTB
*> \verbatim
*> LTB is INTEGER
-*> The size of the array TB. LTB >= 4*N, internally
+*> The size of the array TB. LTB >= MAX(1,4*N), internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*> If LTB = -1, then a workspace query is assumed; the
@@ -148,14 +148,15 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION workspace of size LWORK
+*> WORK is DOUBLE PRECISION workspace of size (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The size of WORK. LWORK >= N, internally used to select NB
-*> such that LWORK >= N*NB.
+*> The size of WORK. LWORK >= MAX(1,N), internally used to
+*> select NB such that LWORK >= N*NB.
*>
*> If LWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal size of the WORK array,
@@ -179,7 +180,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYsolve
+*> \ingroup hesv_aa_2stage
*
* =====================================================================
SUBROUTINE DSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
@@ -205,7 +206,7 @@ SUBROUTINE DSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
*
* .. Local Scalars ..
LOGICAL UPPER, TQUERY, WQUERY
- INTEGER LWKOPT
+ INTEGER LWKMIN, LWKOPT
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -226,6 +227,7 @@ SUBROUTINE DSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
UPPER = LSAME( UPLO, 'U' )
WQUERY = ( LWORK.EQ.-1 )
TQUERY = ( LTB.EQ.-1 )
+ LWKMIN = MAX( 1, N )
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -234,18 +236,19 @@ SUBROUTINE DSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
INFO = -3
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -5
- ELSE IF( LTB.LT.( 4*N ) .AND. .NOT.TQUERY ) THEN
+ ELSE IF( LTB.LT.MAX( 1, 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
+ ELSE IF( LWORK.LT.LWKMIN .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) )
+ LWKOPT = MAX( LWKMIN, INT( WORK( 1 ) ) )
+ WORK( 1 ) = LWKOPT
END IF
*
IF( INFO.NE.0 ) THEN
@@ -255,7 +258,6 @@ SUBROUTINE DSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
RETURN
END IF
*
-*
* Compute the factorization A = U**T*T*U or A = L*T*L**T.
*
CALL DSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV, IPIV2,
diff --git a/lapack-netlib/SRC/dsysvx.f b/lapack-netlib/SRC/dsysvx.f
index a30831e726..b2b8210ca4 100644
--- a/lapack-netlib/SRC/dsysvx.f
+++ b/lapack-netlib/SRC/dsysvx.f
@@ -275,7 +275,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYsolve
+*> \ingroup hesvx
*
* =====================================================================
SUBROUTINE DSYSVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
@@ -305,7 +305,7 @@ SUBROUTINE DSYSVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, NOFACT
- INTEGER LWKOPT, NB
+ INTEGER LWKMIN, LWKOPT, NB
DOUBLE PRECISION ANORM
* ..
* .. External Functions ..
@@ -327,6 +327,7 @@ SUBROUTINE DSYSVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
INFO = 0
NOFACT = LSAME( FACT, 'N' )
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 3*N )
IF( .NOT.NOFACT .AND. .NOT.LSAME( FACT, 'F' ) ) THEN
INFO = -1
ELSE IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) )
@@ -344,12 +345,12 @@ SUBROUTINE DSYSVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
INFO = -11
ELSE IF( LDX.LT.MAX( 1, N ) ) THEN
INFO = -13
- ELSE IF( LWORK.LT.MAX( 1, 3*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -18
END IF
*
IF( INFO.EQ.0 ) THEN
- LWKOPT = MAX( 1, 3*N )
+ LWKOPT = LWKMIN
IF( NOFACT ) THEN
NB = ILAENV( 1, 'DSYTRF', UPLO, N, -1, -1, -1 )
LWKOPT = MAX( LWKOPT, N*NB )
diff --git a/lapack-netlib/SRC/dsytrd.f b/lapack-netlib/SRC/dsytrd.f
index 3dcfc3db2b..58d4b633b8 100644
--- a/lapack-netlib/SRC/dsytrd.f
+++ b/lapack-netlib/SRC/dsytrd.f
@@ -139,7 +139,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYcomputational
+*> \ingroup hetrd
*
*> \par Further Details:
* =====================
@@ -247,7 +247,7 @@ SUBROUTINE DSYTRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO )
* Determine the block size.
*
NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 )
- LWKOPT = N*NB
+ LWKOPT = MAX( 1, N*NB )
WORK( 1 ) = LWKOPT
END IF
*
diff --git a/lapack-netlib/SRC/dsytrd_2stage.f b/lapack-netlib/SRC/dsytrd_2stage.f
index 8ae77d3e4b..a88ac1c73f 100644
--- a/lapack-netlib/SRC/dsytrd_2stage.f
+++ b/lapack-netlib/SRC/dsytrd_2stage.f
@@ -4,23 +4,23 @@
*
* =========== DOCUMENTATION ===========
*
-* Online html documentation available at
-* http://www.netlib.org/lapack/explore-html/
+* Online html documentation available at
+* http://www.netlib.org/lapack/explore-html/
*
*> \htmlonly
-*> Download DSYTRD_2STAGE + dependencies
-*>
-*> [TGZ]
-*>
-*> [ZIP]
-*>
+*> Download DSYTRD_2STAGE + dependencies
+*>
+*> [TGZ]
+*>
+*> [ZIP]
+*>
*> [TXT]
-*> \endhtmlonly
+*> \endhtmlonly
*
* Definition:
* ===========
*
-* SUBROUTINE DSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
+* SUBROUTINE DSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
* HOUS2, LHOUS2, WORK, LWORK, INFO )
*
* IMPLICIT NONE
@@ -34,7 +34,7 @@
* DOUBLE PRECISION A( LDA, * ), TAU( * ),
* HOUS2( * ), WORK( * )
* ..
-*
+*
*
*> \par Purpose:
* =============
@@ -52,11 +52,11 @@
*> \param[in] VECT
*> \verbatim
*> VECT is CHARACTER*1
-*> = 'N': No need for the Housholder representation,
+*> = 'N': No need for the Housholder representation,
*> in particular for the second stage (Band to
*> tridiagonal) and thus LHOUS2 is of size max(1, 4*N);
-*> = 'V': the Householder representation is needed to
-*> either generate Q1 Q2 or to apply Q1 Q2,
+*> = 'V': the Householder representation is needed to
+*> either generate Q1 Q2 or to apply Q1 Q2,
*> then LHOUS2 is to be queried and computed.
*> (NOT AVAILABLE IN THIS RELEASE).
*> \endverbatim
@@ -86,7 +86,7 @@
*> triangular part of A is not referenced.
*> On exit, if UPLO = 'U', the band superdiagonal
*> of A are overwritten by the corresponding elements of the
-*> internal band-diagonal matrix AB, and the elements above
+*> internal band-diagonal matrix AB, and the elements above
*> the KD superdiagonal, with the array TAU, represent the orthogonal
*> matrix Q1 as a product of elementary reflectors; if UPLO
*> = 'L', the diagonal and band subdiagonal of A are over-
@@ -117,13 +117,13 @@
*> \param[out] TAU
*> \verbatim
*> TAU is DOUBLE PRECISION array, dimension (N-KD)
-*> The scalar factors of the elementary reflectors of
+*> The scalar factors of the elementary reflectors of
*> the first stage (see Further Details).
*> \endverbatim
*>
*> \param[out] HOUS2
*> \verbatim
-*> HOUS2 is DOUBLE PRECISION array, dimension (LHOUS2)
+*> HOUS2 is DOUBLE PRECISION array, dimension (MAX(1,LHOUS2))
*> Stores the Householder representation of the stage2
*> band to tridiagonal.
*> \endverbatim
@@ -132,6 +132,8 @@
*> \verbatim
*> LHOUS2 is INTEGER
*> The dimension of the array HOUS2.
+*> LHOUS2 >= 1.
+*>
*> If LWORK = -1, or LHOUS2 = -1,
*> then a query is assumed; the routine
*> only calculates the optimal size of the HOUS2 array, returns
@@ -143,23 +145,26 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION array, dimension (LWORK)
+*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK = MAX(1, dimension)
-*> If LWORK = -1, or LHOUS2=-1,
+*> The dimension of the array WORK.
+*> If N = 0, LWORK >= 1, else LWORK = MAX(1, dimension).
+*>
+*> If LWORK = -1, or LHOUS2 = -1,
*> then a workspace query is assumed; the routine
*> only 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 LWORK is issued by XERBLA.
*> LWORK = MAX(1, dimension) where
*> dimension = max(stage1,stage2) + (KD+1)*N
-*> = N*KD + N*max(KD+1,FACTOPTNB)
-*> + max(2*KD*KD, KD*NTHREADS)
-*> + (KD+1)*N
+*> = N*KD + N*max(KD+1,FACTOPTNB)
+*> + max(2*KD*KD, KD*NTHREADS)
+*> + (KD+1)*N
*> where KD is the blocking size of the reduction,
*> FACTOPTNB is the blocking used by the QR or LQ
*> algorithm, usually FACTOPTNB=128 is a good choice
@@ -177,12 +182,12 @@
* Authors:
* ========
*
-*> \author Univ. of Tennessee
-*> \author Univ. of California Berkeley
-*> \author Univ. of Colorado Denver
-*> \author NAG Ltd.
+*> \author Univ. of Tennessee
+*> \author Univ. of California Berkeley
+*> \author Univ. of Colorado Denver
+*> \author NAG Ltd.
*
-*> \ingroup doubleSYcomputational
+*> \ingroup hetrd_2stage
*
*> \par Further Details:
* =====================
@@ -202,7 +207,7 @@
*> http://doi.acm.org/10.1145/2063384.2063394
*>
*> A. Haidar, J. Kurzak, P. Luszczek, 2013.
-*> An improved parallel singular value algorithm and its implementation
+*> An improved parallel singular value algorithm and its implementation
*> for multicore hardware, In Proceedings of 2013 International Conference
*> for High Performance Computing, Networking, Storage and Analysis (SC '13).
*> Denver, Colorado, USA, 2013.
@@ -210,16 +215,16 @@
*> http://doi.acm.org/10.1145/2503210.2503292
*>
*> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
-*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
+*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
*> calculations based on fine-grained memory aware tasks.
*> International Journal of High Performance Computing Applications.
*> Volume 28 Issue 2, Pages 196-209, May 2014.
-*> http://hpc.sagepub.com/content/28/2/196
+*> http://hpc.sagepub.com/content/28/2/196
*>
*> \endverbatim
*>
* =====================================================================
- SUBROUTINE DSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
+ SUBROUTINE DSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
$ HOUS2, LHOUS2, WORK, LWORK, INFO )
*
IMPLICIT NONE
@@ -265,10 +270,13 @@ SUBROUTINE DSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
*
KD = ILAENV2STAGE( 1, 'DSYTRD_2STAGE', VECT, N, -1, -1, -1 )
IB = ILAENV2STAGE( 2, 'DSYTRD_2STAGE', VECT, N, KD, -1, -1 )
- LHMIN = ILAENV2STAGE( 3, 'DSYTRD_2STAGE', VECT, N, KD, IB, -1 )
- LWMIN = ILAENV2STAGE( 4, 'DSYTRD_2STAGE', VECT, N, KD, IB, -1 )
-* WRITE(*,*),'DSYTRD_2STAGE N KD UPLO LHMIN LWMIN ',N, KD, UPLO,
-* $ LHMIN, LWMIN
+ IF( N.EQ.0 ) THEN
+ LHMIN = 1
+ LWMIN = 1
+ ELSE
+ LHMIN = ILAENV2STAGE( 3, 'DSYTRD_2STAGE', VECT, N, KD, IB, -1 )
+ LWMIN = ILAENV2STAGE( 4, 'DSYTRD_2STAGE', VECT, N, KD, IB, -1 )
+ END IF
*
IF( .NOT.LSAME( VECT, 'N' ) ) THEN
INFO = -1
@@ -309,14 +317,14 @@ SUBROUTINE DSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
LWRK = LWORK-LDAB*N
ABPOS = 1
WPOS = ABPOS + LDAB*N
- CALL DSYTRD_SY2SB( UPLO, N, KD, A, LDA, WORK( ABPOS ), LDAB,
+ CALL DSYTRD_SY2SB( UPLO, N, KD, A, LDA, WORK( ABPOS ), LDAB,
$ TAU, WORK( WPOS ), LWRK, INFO )
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'DSYTRD_SY2SB', -INFO )
RETURN
END IF
- CALL DSYTRD_SB2ST( 'Y', VECT, UPLO, N, KD,
- $ WORK( ABPOS ), LDAB, D, E,
+ CALL DSYTRD_SB2ST( 'Y', VECT, UPLO, N, KD,
+ $ WORK( ABPOS ), LDAB, D, E,
$ HOUS2, LHOUS2, WORK( WPOS ), LWRK, INFO )
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'DSYTRD_SB2ST', -INFO )
@@ -324,8 +332,7 @@ SUBROUTINE DSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
END IF
*
*
- HOUS2( 1 ) = LHMIN
- WORK( 1 ) = LWMIN
+ WORK( 1 ) = LWMIN
RETURN
*
* End of DSYTRD_2STAGE
diff --git a/lapack-netlib/SRC/dsytrd_sb2st.F b/lapack-netlib/SRC/dsytrd_sb2st.F
index bb74dd4914..04d03d587a 100644
--- a/lapack-netlib/SRC/dsytrd_sb2st.F
+++ b/lapack-netlib/SRC/dsytrd_sb2st.F
@@ -18,7 +18,7 @@
* Definition:
* ===========
*
-* SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
+* SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
* D, E, HOUS, LHOUS, WORK, LWORK, INFO )
*
* #if defined(_OPENMP)
@@ -53,12 +53,12 @@
*> \param[in] STAGE1
*> \verbatim
*> STAGE1 is CHARACTER*1
-*> = 'N': "No": to mention that the stage 1 of the reduction
+*> = 'N': "No": to mention that the stage 1 of the reduction
*> from dense to band using the dsytrd_sy2sb routine
-*> was not called before this routine to reproduce AB.
-*> In other term this routine is called as standalone.
-*> = 'Y': "Yes": to mention that the stage 1 of the
-*> reduction from dense to band using the dsytrd_sy2sb
+*> was not called before this routine to reproduce AB.
+*> In other term this routine is called as standalone.
+*> = 'Y': "Yes": to mention that the stage 1 of the
+*> reduction from dense to band using the dsytrd_sy2sb
*> routine has been called to produce AB (e.g., AB is
*> the output of dsytrd_sy2sb.
*> \endverbatim
@@ -66,10 +66,10 @@
*> \param[in] VECT
*> \verbatim
*> VECT is CHARACTER*1
-*> = 'N': No need for the Housholder representation,
+*> = 'N': No need for the Housholder representation,
*> and thus LHOUS is of size max(1, 4*N);
-*> = 'V': the Householder representation is needed to
-*> either generate or to apply Q later on,
+*> = 'V': the Householder representation is needed to
+*> either generate or to apply Q later on,
*> then LHOUS is to be queried and computed.
*> (NOT AVAILABLE IN THIS RELEASE).
*> \endverbatim
@@ -132,34 +132,39 @@
*>
*> \param[out] HOUS
*> \verbatim
-*> HOUS is DOUBLE PRECISION array, dimension LHOUS, that
-*> store the Householder representation.
+*> HOUS is DOUBLE PRECISION array, dimension (MAX(1,LHOUS))
+*> Stores the Householder representation.
*> \endverbatim
*>
*> \param[in] LHOUS
*> \verbatim
*> LHOUS is INTEGER
-*> The dimension of the array HOUS. LHOUS = MAX(1, dimension)
-*> If LWORK = -1, or LHOUS=-1,
+*> The dimension of the array HOUS.
+*> If N = 0 or KD <= 1, LHOUS >= 1, else LHOUS = MAX(1, dimension).
+*>
+*> If LWORK = -1, or LHOUS = -1,
*> then a query is assumed; the routine
*> only calculates the optimal size of the HOUS array, returns
*> this value as the first entry of the HOUS array, and no error
*> message related to LHOUS is issued by XERBLA.
*> LHOUS = MAX(1, dimension) where
*> dimension = 4*N if VECT='N'
-*> not available now if VECT='H'
+*> not available now if VECT='H'
*> \endverbatim
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION array, dimension LWORK.
+*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK = MAX(1, dimension)
-*> If LWORK = -1, or LHOUS=-1,
+*> The dimension of the array WORK.
+*> If N = 0 or KD <= 1, LWORK >= 1, else LWORK = MAX(1, dimension).
+*>
+*> If LWORK = -1, or LHOUS = -1,
*> then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
@@ -188,7 +193,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup real16OTHERcomputational
+*> \ingroup hetrd_hb2st
*
*> \par Further Details:
* =====================
@@ -208,7 +213,7 @@
*> http://doi.acm.org/10.1145/2063384.2063394
*>
*> A. Haidar, J. Kurzak, P. Luszczek, 2013.
-*> An improved parallel singular value algorithm and its implementation
+*> An improved parallel singular value algorithm and its implementation
*> for multicore hardware, In Proceedings of 2013 International Conference
*> for High Performance Computing, Networking, Storage and Analysis (SC '13).
*> Denver, Colorado, USA, 2013.
@@ -216,16 +221,16 @@
*> http://doi.acm.org/10.1145/2503210.2503292
*>
*> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
-*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
+*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
*> calculations based on fine-grained memory aware tasks.
*> International Journal of High Performance Computing Applications.
*> Volume 28 Issue 2, Pages 196-209, May 2014.
-*> http://hpc.sagepub.com/content/28/2/196
+*> http://hpc.sagepub.com/content/28/2/196
*>
*> \endverbatim
*>
* =====================================================================
- SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
+ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
$ D, E, HOUS, LHOUS, WORK, LWORK, INFO )
*
#if defined(_OPENMP)
@@ -258,11 +263,11 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, WANTQ, UPPER, AFTERS1
- INTEGER I, M, K, IB, SWEEPID, MYID, SHIFT, STT, ST,
+ INTEGER I, M, K, IB, SWEEPID, MYID, SHIFT, STT, ST,
$ ED, STIND, EDIND, BLKLASTIND, COLPT, THED,
$ STEPERCOL, GRSIZ, THGRSIZ, THGRNB, THGRID,
- $ NBTILES, TTYPE, TID, NTHREADS, DEBUG,
- $ ABDPOS, ABOFDPOS, DPOS, OFDPOS, AWPOS,
+ $ NBTILES, TTYPE, TID, NTHREADS,
+ $ ABDPOS, ABOFDPOS, DPOS, OFDPOS, AWPOS,
$ INDA, INDW, APOS, SIZEA, LDA, INDV, INDTAU,
$ SIDEV, SIZETAU, LDV, LHMIN, LWMIN
* ..
@@ -274,7 +279,7 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
* ..
* .. External Functions ..
LOGICAL LSAME
- INTEGER ILAENV2STAGE
+ INTEGER ILAENV2STAGE
EXTERNAL LSAME, ILAENV2STAGE
* ..
* .. Executable Statements ..
@@ -282,7 +287,6 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
* Determine the minimal workspace size required.
* Test the input parameters
*
- DEBUG = 0
INFO = 0
AFTERS1 = LSAME( STAGE1, 'Y' )
WANTQ = LSAME( VECT, 'V' )
@@ -291,9 +295,14 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
*
* Determine the block size, the workspace size and the hous size.
*
- IB = ILAENV2STAGE( 2, 'DSYTRD_SB2ST', VECT, N, KD, -1, -1 )
- LHMIN = ILAENV2STAGE( 3, 'DSYTRD_SB2ST', VECT, N, KD, IB, -1 )
- LWMIN = ILAENV2STAGE( 4, 'DSYTRD_SB2ST', VECT, N, KD, IB, -1 )
+ IB = ILAENV2STAGE( 2, 'DSYTRD_SB2ST', VECT, N, KD, -1, -1 )
+ IF( N.EQ.0 .OR. KD.LE.1 ) THEN
+ LHMIN = 1
+ LWMIN = 1
+ ELSE
+ LHMIN = ILAENV2STAGE( 3, 'DSYTRD_SB2ST', VECT, N, KD, IB, -1 )
+ LWMIN = ILAENV2STAGE( 4, 'DSYTRD_SB2ST', VECT, N, KD, IB, -1 )
+ END IF
*
IF( .NOT.AFTERS1 .AND. .NOT.LSAME( STAGE1, 'N' ) ) THEN
INFO = -1
@@ -355,7 +364,7 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
ABDPOS = KD + 1
ABOFDPOS = KD
ELSE
- APOS = INDA
+ APOS = INDA
AWPOS = INDA + KD + 1
DPOS = APOS
OFDPOS = DPOS + 1
@@ -363,11 +372,11 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
ABOFDPOS = 2
ENDIF
-*
-* Case KD=0:
-* The matrix is diagonal. We just copy it (convert to "real" for
-* real because D is double and the imaginary part should be 0)
-* and store it in D. A sequential code here is better or
+*
+* Case KD=0:
+* The matrix is diagonal. We just copy it (convert to "real" for
+* real because D is double and the imaginary part should be 0)
+* and store it in D. A sequential code here is better or
* in a parallel environment it might need two cores for D and E
*
IF( KD.EQ.0 ) THEN
@@ -382,17 +391,17 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
WORK( 1 ) = 1
RETURN
END IF
-*
-* Case KD=1:
-* The matrix is already Tridiagonal. We have to make diagonal
+*
+* Case KD=1:
+* The matrix is already Tridiagonal. We have to make diagonal
* and offdiagonal elements real, and store them in D and E.
-* For that, for real precision just copy the diag and offdiag
-* to D and E while for the COMPLEX case the bulge chasing is
-* performed to convert the hermetian tridiagonal to symmetric
-* tridiagonal. A simpler conversion formula might be used, but then
+* For that, for real precision just copy the diag and offdiag
+* to D and E while for the COMPLEX case the bulge chasing is
+* performed to convert the hermetian tridiagonal to symmetric
+* tridiagonal. A simpler conversion formula might be used, but then
* updating the Q matrix will be required and based if Q is generated
-* or not this might complicate the story.
-*
+* or not this might complicate the story.
+*
IF( KD.EQ.1 ) THEN
DO 50 I = 1, N
D( I ) = ( AB( ABDPOS, I ) )
@@ -413,7 +422,7 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
RETURN
END IF
*
-* Main code start here.
+* Main code start here.
* Reduce the symmetric band of A to a tridiagonal matrix.
*
THGRSIZ = N
@@ -422,7 +431,7 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
NBTILES = CEILING( REAL(N)/REAL(KD) )
STEPERCOL = CEILING( REAL(SHIFT)/REAL(GRSIZ) )
THGRNB = CEILING( REAL(N-1)/REAL(THGRSIZ) )
-*
+*
CALL DLACPY( "A", KD+1, N, AB, LDAB, WORK( APOS ), LDA )
CALL DLASET( "A", KD, N, ZERO, ZERO, WORK( AWPOS ), LDA )
*
@@ -431,7 +440,7 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
*
#if defined(_OPENMP)
!$OMP PARALLEL PRIVATE( TID, THGRID, BLKLASTIND )
-!$OMP$ PRIVATE( THED, I, M, K, ST, ED, STT, SWEEPID )
+!$OMP$ PRIVATE( THED, I, M, K, ST, ED, STT, SWEEPID )
!$OMP$ PRIVATE( MYID, TTYPE, COLPT, STIND, EDIND )
!$OMP$ SHARED ( UPLO, WANTQ, INDV, INDTAU, HOUS, WORK)
!$OMP$ SHARED ( N, KD, IB, NBTILES, LDA, LDV, INDA )
@@ -440,7 +449,7 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
#endif
*
* main bulge chasing loop
-*
+*
DO 100 THGRID = 1, THGRNB
STT = (THGRID-1)*THGRSIZ+1
THED = MIN( (STT + THGRSIZ -1), (N-1))
@@ -451,7 +460,7 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
ST = STT
DO 130 SWEEPID = ST, ED
DO 140 K = 1, GRSIZ
- MYID = (I-SWEEPID)*(STEPERCOL*GRSIZ)
+ MYID = (I-SWEEPID)*(STEPERCOL*GRSIZ)
$ + (M-1)*GRSIZ + K
IF ( MYID.EQ.1 ) THEN
TTYPE = 1
@@ -477,16 +486,16 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
ENDIF
*
* Call the kernel
-*
+*
#if defined(_OPENMP) && _OPENMP >= 201307
- IF( TTYPE.NE.1 ) THEN
+ IF( TTYPE.NE.1 ) THEN
!$OMP TASK DEPEND(in:WORK(MYID+SHIFT-1))
!$OMP$ DEPEND(in:WORK(MYID-1))
!$OMP$ DEPEND(out:WORK(MYID))
TID = OMP_GET_THREAD_NUM()
- CALL DSB2ST_KERNELS( UPLO, WANTQ, TTYPE,
+ CALL DSB2ST_KERNELS( UPLO, WANTQ, TTYPE,
$ STIND, EDIND, SWEEPID, N, KD, IB,
- $ WORK ( INDA ), LDA,
+ $ WORK ( INDA ), LDA,
$ HOUS( INDV ), HOUS( INDTAU ), LDV,
$ WORK( INDW + TID*KD ) )
!$OMP END TASK
@@ -494,20 +503,20 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
!$OMP TASK DEPEND(in:WORK(MYID+SHIFT-1))
!$OMP$ DEPEND(out:WORK(MYID))
TID = OMP_GET_THREAD_NUM()
- CALL DSB2ST_KERNELS( UPLO, WANTQ, TTYPE,
+ CALL DSB2ST_KERNELS( UPLO, WANTQ, TTYPE,
$ STIND, EDIND, SWEEPID, N, KD, IB,
- $ WORK ( INDA ), LDA,
+ $ WORK ( INDA ), LDA,
$ HOUS( INDV ), HOUS( INDTAU ), LDV,
$ WORK( INDW + TID*KD ) )
!$OMP END TASK
ENDIF
#else
- CALL DSB2ST_KERNELS( UPLO, WANTQ, TTYPE,
+ CALL DSB2ST_KERNELS( UPLO, WANTQ, TTYPE,
$ STIND, EDIND, SWEEPID, N, KD, IB,
- $ WORK ( INDA ), LDA,
+ $ WORK ( INDA ), LDA,
$ HOUS( INDV ), HOUS( INDTAU ), LDV,
$ WORK( INDW ) )
-#endif
+#endif
IF ( BLKLASTIND.GE.(N-1) ) THEN
STT = STT + 1
EXIT
@@ -522,14 +531,14 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
!$OMP END MASTER
!$OMP END PARALLEL
#endif
-*
+*
* Copy the diagonal from A to D. Note that D is REAL thus only
* the Real part is needed, the imaginary part should be zero.
*
DO 150 I = 1, N
D( I ) = ( WORK( DPOS+(I-1)*LDA ) )
150 CONTINUE
-*
+*
* Copy the off diagonal from A to E. Note that E is REAL thus only
* the Real part is needed, the imaginary part should be zero.
*
@@ -543,11 +552,10 @@ SUBROUTINE DSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
170 CONTINUE
ENDIF
*
- HOUS( 1 ) = LHMIN
WORK( 1 ) = LWMIN
RETURN
*
* End of DSYTRD_SB2ST
*
END
-
+
diff --git a/lapack-netlib/SRC/dsytrd_sy2sb.f b/lapack-netlib/SRC/dsytrd_sy2sb.f
index 1660b5c7e3..38acc71f1f 100644
--- a/lapack-netlib/SRC/dsytrd_sy2sb.f
+++ b/lapack-netlib/SRC/dsytrd_sy2sb.f
@@ -123,8 +123,8 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION array, dimension (LWORK)
-*> On exit, if INFO = 0, or if LWORK=-1,
+*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, or if LWORK = -1,
*> WORK(1) returns the size of LWORK.
*> \endverbatim
*>
@@ -132,7 +132,9 @@
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK which should be calculated
-*> by a workspace query. LWORK = MAX(1, LWORK_QUERY)
+*> by a workspace query.
+*> If N <= KD+1, LWORK >= 1, else LWORK = MAX(1, LWORK_QUERY)
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
@@ -158,7 +160,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYcomputational
+*> \ingroup hetrd_he2hb
*
*> \par Further Details:
* =====================
@@ -293,8 +295,12 @@ SUBROUTINE DSYTRD_SY2SB( UPLO, N, KD, A, LDA, AB, LDAB, TAU,
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
- LWMIN = ILAENV2STAGE( 4, 'DSYTRD_SY2SB', '', N, KD, -1, -1 )
-
+ IF( N.LE.KD+1 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = ILAENV2STAGE( 4, 'DSYTRD_SY2SB', ' ', N, KD, -1, -1 )
+ END IF
+*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
diff --git a/lapack-netlib/SRC/dsytrf.f b/lapack-netlib/SRC/dsytrf.f
index aee9b3f6ac..2a1a2d4dc4 100644
--- a/lapack-netlib/SRC/dsytrf.f
+++ b/lapack-netlib/SRC/dsytrf.f
@@ -107,7 +107,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >=1. For best performance
+*> The length of WORK. LWORK >= 1. For best performance
*> LWORK >= N*NB, where NB is the block size returned by ILAENV.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
@@ -135,7 +135,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYcomputational
+*> \ingroup hetrf
*
*> \par Further Details:
* =====================
@@ -352,6 +352,7 @@ SUBROUTINE DSYTRF( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
END IF
*
40 CONTINUE
+*
WORK( 1 ) = LWKOPT
RETURN
*
diff --git a/lapack-netlib/SRC/dsytrf_aa.f b/lapack-netlib/SRC/dsytrf_aa.f
index 9a0b26ce53..924d4c1650 100644
--- a/lapack-netlib/SRC/dsytrf_aa.f
+++ b/lapack-netlib/SRC/dsytrf_aa.f
@@ -101,8 +101,10 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >= MAX(1,2*N). For optimum performance
-*> LWORK >= N*(1+NB), where NB is the optimal blocksize.
+*> The length of WORK.
+*> LWORK >= 1, if N <= 1, and LWORK >= 2*N, otherwise.
+*> For optimum performance LWORK >= N*(1+NB), where NB is
+*> the optimal blocksize, returned by ILAENV.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -125,10 +127,10 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYcomputational
+*> \ingroup hetrf_aa
*
* =====================================================================
- SUBROUTINE DSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
+ SUBROUTINE DSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
@@ -152,7 +154,7 @@ SUBROUTINE DSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
*
* .. Local Scalars ..
LOGICAL LQUERY, UPPER
- INTEGER J, LWKOPT
+ INTEGER J, LWKMIN, LWKOPT
INTEGER NB, MJ, NJ, K1, K2, J1, J2, J3, JB
DOUBLE PRECISION ALPHA
* ..
@@ -179,18 +181,25 @@ SUBROUTINE DSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
+ IF( N.LE.1 ) THEN
+ LWKMIN = 1
+ LWKOPT = 1
+ ELSE
+ LWKMIN = 2*N
+ LWKOPT = (NB+1)*N
+ END IF
+*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, 2*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -7
END IF
*
IF( INFO.EQ.0 ) THEN
- LWKOPT = (NB+1)*N
WORK( 1 ) = LWKOPT
END IF
*
@@ -203,11 +212,11 @@ SUBROUTINE DSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
*
* Quick return
*
- IF ( N.EQ.0 ) THEN
+ IF( N.EQ.0 ) THEN
RETURN
ENDIF
IPIV( 1 ) = 1
- IF ( N.EQ.1 ) THEN
+ IF( N.EQ.1 ) THEN
RETURN
END IF
*
diff --git a/lapack-netlib/SRC/dsytrf_aa_2stage.f b/lapack-netlib/SRC/dsytrf_aa_2stage.f
index c65bd86e62..fae95bab24 100644
--- a/lapack-netlib/SRC/dsytrf_aa_2stage.f
+++ b/lapack-netlib/SRC/dsytrf_aa_2stage.f
@@ -87,14 +87,14 @@
*>
*> \param[out] TB
*> \verbatim
-*> TB is DOUBLE PRECISION array, dimension (LTB)
+*> TB is DOUBLE PRECISION array, dimension (MAX(1,LTB))
*> On exit, details of the LU factorization of the band matrix.
*> \endverbatim
*>
*> \param[in] LTB
*> \verbatim
*> LTB is INTEGER
-*> The size of the array TB. LTB >= 4*N, internally
+*> The size of the array TB. LTB >= MAX(1,4*N), internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*> If LTB = -1, then a workspace query is assumed; the
@@ -121,14 +121,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION workspace of size LWORK
+*> WORK is DOUBLE PRECISION workspace of size (MAX(1,LWORK))
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The size of WORK. LWORK >= N, internally used to select NB
-*> such that LWORK >= N*NB.
+*> The size of WORK. LWORK >= MAX(1,N), internally used
+*> to select NB such that LWORK >= N*NB.
*>
*> If LWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal size of the WORK array,
@@ -152,7 +152,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYcomputational
+*> \ingroup hetrf_aa_2stage
*
* =====================================================================
SUBROUTINE DSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
@@ -211,9 +211,9 @@ SUBROUTINE DSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF ( LTB .LT. 4*N .AND. .NOT.TQUERY ) THEN
+ ELSE IF( LTB.LT.MAX( 1, 4*N ) .AND. .NOT.TQUERY ) THEN
INFO = -6
- ELSE IF ( LWORK .LT. N .AND. .NOT.WQUERY ) THEN
+ ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.WQUERY ) THEN
INFO = -10
END IF
*
@@ -227,10 +227,10 @@ SUBROUTINE DSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
NB = ILAENV( 1, 'DSYTRF_AA_2STAGE', UPLO, N, -1, -1, -1 )
IF( INFO.EQ.0 ) THEN
IF( TQUERY ) THEN
- TB( 1 ) = (3*NB+1)*N
+ TB( 1 ) = MAX( 1, (3*NB+1)*N )
END IF
IF( WQUERY ) THEN
- WORK( 1 ) = N*NB
+ WORK( 1 ) = MAX( 1, N*NB )
END IF
END IF
IF( TQUERY .OR. WQUERY ) THEN
@@ -239,7 +239,7 @@ SUBROUTINE DSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
*
* Quick return
*
- IF ( N.EQ.0 ) THEN
+ IF( N.EQ.0 ) THEN
RETURN
ENDIF
*
diff --git a/lapack-netlib/SRC/dsytrf_rk.f b/lapack-netlib/SRC/dsytrf_rk.f
index 0865869684..0717eb0765 100644
--- a/lapack-netlib/SRC/dsytrf_rk.f
+++ b/lapack-netlib/SRC/dsytrf_rk.f
@@ -177,14 +177,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION array, dimension ( MAX(1,LWORK) ).
+*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)).
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >=1. For best performance
+*> The length of WORK. LWORK >= 1. For best performance
*> LWORK >= N*NB, where NB is the block size returned
*> by ILAENV.
*>
@@ -229,7 +229,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYcomputational
+*> \ingroup hetrf_rk
*
*> \par Further Details:
* =====================
diff --git a/lapack-netlib/SRC/dsytrf_rook.f b/lapack-netlib/SRC/dsytrf_rook.f
index 2f00d18024..3166634857 100644
--- a/lapack-netlib/SRC/dsytrf_rook.f
+++ b/lapack-netlib/SRC/dsytrf_rook.f
@@ -118,7 +118,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >=1. For best performance
+*> The length of WORK. LWORK >= 1. For best performance
*> LWORK >= N*NB, where NB is the block size returned by ILAENV.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
@@ -146,7 +146,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYcomputational
+*> \ingroup hetrf_rook
*
*> \par Further Details:
* =====================
diff --git a/lapack-netlib/SRC/dsytri2.f b/lapack-netlib/SRC/dsytri2.f
index dbcdcdb588..5960d39928 100644
--- a/lapack-netlib/SRC/dsytri2.f
+++ b/lapack-netlib/SRC/dsytri2.f
@@ -88,16 +88,16 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION array, dimension (N+NB+1)*(NB+3)
+*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*> WORK is size >= (N+NB+1)*(NB+3)
+*> If N = 0, LWORK >= 1, else LWORK >= (N+NB+1)*(NB+3).
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> calculates:
+*> 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 LWORK is issued by XERBLA.
@@ -120,7 +120,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYcomputational
+*> \ingroup hetri2
*
* =====================================================================
SUBROUTINE DSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
@@ -159,9 +159,13 @@ SUBROUTINE DSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
+*
* Get blocksize
+*
NBMAX = ILAENV( 1, 'DSYTRI2', UPLO, N, -1, -1, -1 )
- IF ( NBMAX .GE. N ) THEN
+ IF( N.EQ.0 ) THEN
+ MINSIZE = 1
+ ELSE IF( NBMAX.GE.N ) THEN
MINSIZE = N
ELSE
MINSIZE = (N+NBMAX+1)*(NBMAX+3)
@@ -173,28 +177,29 @@ SUBROUTINE DSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF (LWORK .LT. MINSIZE .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.MINSIZE .AND. .NOT.LQUERY ) THEN
INFO = -7
END IF
-*
-* Quick return if possible
-*
*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'DSYTRI2', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- WORK(1)=MINSIZE
+ WORK( 1 ) = MINSIZE
RETURN
END IF
+*
+* Quick return if possible
+*
IF( N.EQ.0 )
$ RETURN
- IF( NBMAX .GE. N ) THEN
+ IF( NBMAX.GE.N ) THEN
CALL DSYTRI( UPLO, N, A, LDA, IPIV, WORK, INFO )
ELSE
CALL DSYTRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO )
END IF
+*
RETURN
*
* End of DSYTRI2
diff --git a/lapack-netlib/SRC/dsytri_3.f b/lapack-netlib/SRC/dsytri_3.f
index 86d69cdfdd..50834c605e 100644
--- a/lapack-netlib/SRC/dsytri_3.f
+++ b/lapack-netlib/SRC/dsytri_3.f
@@ -119,16 +119,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is DOUBLE PRECISION array, dimension (N+NB+1)*(NB+3).
+*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)).
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >= (N+NB+1)*(NB+3).
+*> The length of WORK.
+*> If N = 0, LWORK >= 1, else LWORK >= (N+NB+1)*(NB+3).
*>
-*> If LDWORK = -1, then a workspace query is assumed;
+*> If LWORK = -1, then a workspace query is assumed;
*> the routine only calculates the optimal size of the optimal
*> size of the WORK array, returns this value as the first
*> entry of the WORK array, and no error message related to
@@ -152,7 +153,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYcomputational
+*> \ingroup hetri_3
*
*> \par Contributors:
* ==================
@@ -208,8 +209,13 @@ SUBROUTINE DSYTRI_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
*
* Determine the block size
*
- NB = MAX( 1, ILAENV( 1, 'DSYTRI_3', UPLO, N, -1, -1, -1 ) )
- LWKOPT = ( N+NB+1 ) * ( NB+3 )
+ IF( N.EQ.0 ) THEN
+ LWKOPT = 1
+ ELSE
+ NB = MAX( 1, ILAENV( 1, 'DSYTRI_3', UPLO, N, -1, -1, -1 ) )
+ LWKOPT = ( N+NB+1 ) * ( NB+3 )
+ END IF
+ WORK( 1 ) = LWKOPT
*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
@@ -217,7 +223,7 @@ SUBROUTINE DSYTRI_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF ( LWORK .LT. LWKOPT .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKOPT .AND. .NOT.LQUERY ) THEN
INFO = -8
END IF
*
@@ -225,7 +231,6 @@ SUBROUTINE DSYTRI_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
CALL XERBLA( 'DSYTRI_3', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- WORK( 1 ) = LWKOPT
RETURN
END IF
*
diff --git a/lapack-netlib/SRC/dsytrs_aa.f b/lapack-netlib/SRC/dsytrs_aa.f
index 26b11a2a0b..f0016cb7f7 100644
--- a/lapack-netlib/SRC/dsytrs_aa.f
+++ b/lapack-netlib/SRC/dsytrs_aa.f
@@ -105,7 +105,13 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,3*N-2).
+*> The dimension of the array WORK.
+*> If MIN(N,NRHS) = 0, LWORK >= 1, else LWORK >= 3*N-2.
+*>
+*> If LWORK = -1, then a workspace query is assumed; the routine
+*> only calculates the minimal size of the WORK array, returns
+*> this value as the first entry of the WORK array, and no error
+*> message related to LWORK is issued by XERBLA.
*> \endverbatim
*>
*> \param[out] INFO
@@ -123,7 +129,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleSYcomputational
+*> \ingroup hetrs_aa
*
* =====================================================================
SUBROUTINE DSYTRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
@@ -151,7 +157,7 @@ SUBROUTINE DSYTRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, UPPER
- INTEGER K, KP, LWKOPT
+ INTEGER K, KP, LWKMIN
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -161,13 +167,19 @@ SUBROUTINE DSYTRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
EXTERNAL DLACPY, DGTSV, DSWAP, DTRSM, XERBLA
* ..
* .. Intrinsic Functions ..
- INTRINSIC MAX
+ INTRINSIC MIN, MAX
* ..
* .. Executable Statements ..
*
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
+ IF( MIN( N, NRHS ).EQ.0 ) THEN
+ LWKMIN = 1
+ ELSE
+ LWKMIN = 3*N-2
+ END IF
+*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -178,21 +190,20 @@ SUBROUTINE DSYTRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
INFO = -5
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -8
- ELSE IF( LWORK.LT.MAX( 1, 3*N-2 ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -10
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'DSYTRS_AA', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- LWKOPT = (3*N-2)
- WORK( 1 ) = LWKOPT
+ WORK( 1 ) = LWKMIN
RETURN
END IF
*
* Quick return if possible
*
- IF( N.EQ.0 .OR. NRHS.EQ.0 )
+ IF( MIN( N, NRHS ).EQ.0 )
$ RETURN
*
IF( UPPER ) THEN
diff --git a/lapack-netlib/SRC/sgebrd.f b/lapack-netlib/SRC/sgebrd.f
index 2d0c6d6511..b33ad0b1f7 100644
--- a/lapack-netlib/SRC/sgebrd.f
+++ b/lapack-netlib/SRC/sgebrd.f
@@ -122,7 +122,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of the array WORK. LWORK >= max(1,M,N).
+*> The length of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MAX(M,N), otherwise.
*> For optimum performance LWORK >= (M+N)*NB, where NB
*> is the optimal blocksize.
*>
@@ -223,8 +224,8 @@ SUBROUTINE SGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
* ..
* .. Local Scalars ..
LOGICAL LQUERY
- INTEGER I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB,
- $ NBMIN, NX, WS
+ INTEGER I, IINFO, J, LDWRKX, LDWRKY, LWKMIN, LWKOPT,
+ $ MINMN, NB, NBMIN, NX, WS
* ..
* .. External Subroutines ..
EXTERNAL SGEBD2, SGEMM, SLABRD, XERBLA
@@ -242,9 +243,16 @@ SUBROUTINE SGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
* Test the input parameters
*
INFO = 0
- NB = MAX( 1, ILAENV( 1, 'SGEBRD', ' ', M, N, -1, -1 ) )
- LWKOPT = ( M+N )*NB
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWKMIN = 1
+ LWKOPT = 1
+ ELSE
+ LWKMIN = MAX( M, N )
+ NB = MAX( 1, ILAENV( 1, 'SGEBRD', ' ', M, N, -1, -1 ) )
+ LWKOPT = ( M+N )*NB
+ ENDIF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -252,7 +260,7 @@ SUBROUTINE SGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
INFO = -2
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, M, N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -10
END IF
IF( INFO.LT.0 ) THEN
@@ -264,7 +272,6 @@ SUBROUTINE SGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
*
* Quick return if possible
*
- MINMN = MIN( M, N )
IF( MINMN.EQ.0 ) THEN
WORK( 1 ) = 1
RETURN
@@ -283,7 +290,7 @@ SUBROUTINE SGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
* Determine when to switch from blocked to unblocked code.
*
IF( NX.LT.MINMN ) THEN
- WS = ( M+N )*NB
+ WS = LWKOPT
IF( LWORK.LT.WS ) THEN
*
* Not enough work space for the optimal NB, consider using
@@ -342,7 +349,8 @@ SUBROUTINE SGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
*
CALL SGEBD2( M-I+1, N-I+1, A( I, I ), LDA, D( I ), E( I ),
$ TAUQ( I ), TAUP( I ), WORK, IINFO )
- WORK( 1 ) = SROUNDUP_LWORK(WS)
+*
+ WORK( 1 ) = SROUNDUP_LWORK( WS )
RETURN
*
* End of SGEBRD
diff --git a/lapack-netlib/SRC/sgehrd.f b/lapack-netlib/SRC/sgehrd.f
index 47733d947e..cfa17e156f 100644
--- a/lapack-netlib/SRC/sgehrd.f
+++ b/lapack-netlib/SRC/sgehrd.f
@@ -89,7 +89,7 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is REAL array, dimension (LWORK)
+*> WORK is REAL array, dimension (MAX(1,LWORK))
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
@@ -173,7 +173,7 @@ SUBROUTINE SGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
INTEGER IHI, ILO, INFO, LDA, LWORK, N
* ..
* .. Array Arguments ..
- REAL A( LDA, * ), TAU( * ), WORK( * )
+ REAL A( LDA, * ), TAU( * ), WORK( * )
* ..
*
* =====================================================================
@@ -182,7 +182,7 @@ SUBROUTINE SGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
INTEGER NBMAX, LDT, TSIZE
PARAMETER ( NBMAX = 64, LDT = NBMAX+1,
$ TSIZE = LDT*NBMAX )
- REAL ZERO, ONE
+ REAL ZERO, ONE
PARAMETER ( ZERO = 0.0E+0,
$ ONE = 1.0E+0 )
* ..
@@ -190,7 +190,7 @@ SUBROUTINE SGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
LOGICAL LQUERY
INTEGER I, IB, IINFO, IWT, J, LDWORK, LWKOPT, NB,
$ NBMIN, NH, NX
- REAL EI
+ REAL EI
* ..
* .. External Subroutines ..
EXTERNAL SAXPY, SGEHD2, SGEMM, SLAHR2, SLARFB, STRMM,
@@ -222,13 +222,19 @@ SUBROUTINE SGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
INFO = -8
END IF
*
+ NH = IHI - ILO + 1
IF( INFO.EQ.0 ) THEN
*
* Compute the workspace requirements
*
- NB = MIN( NBMAX, ILAENV( 1, 'SGEHRD', ' ', N, ILO, IHI, -1 ) )
- LWKOPT = N*NB + TSIZE
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ IF( NH.LE.1 ) THEN
+ LWKOPT = 1
+ ELSE
+ NB = MIN( NBMAX, ILAENV( 1, 'SGEHRD', ' ', N, ILO, IHI,
+ $ -1 ) )
+ LWKOPT = N*NB + TSIZE
+ ENDIF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -249,7 +255,6 @@ SUBROUTINE SGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
*
* Quick return if possible
*
- NH = IHI - ILO + 1
IF( NH.LE.1 ) THEN
WORK( 1 ) = 1
RETURN
@@ -269,7 +274,7 @@ SUBROUTINE SGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
*
* Determine if workspace is large enough for blocked code
*
- IF( LWORK.LT.N*NB+TSIZE ) THEN
+ IF( LWORK.LT.LWKOPT ) THEN
*
* Not enough workspace to use optimal NB: determine the
* minimum value of NB, and reduce NB or force use of
@@ -345,7 +350,8 @@ SUBROUTINE SGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
* Use unblocked code to reduce the rest of the matrix
*
CALL SGEHD2( N, I, IHI, A, LDA, TAU, WORK, IINFO )
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+*
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/sgelq.f b/lapack-netlib/SRC/sgelq.f
index 74c7cc267a..75f02675d8 100644
--- a/lapack-netlib/SRC/sgelq.f
+++ b/lapack-netlib/SRC/sgelq.f
@@ -98,7 +98,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1 or -2, then a workspace query is assumed. The routine
*> only calculates the sizes of the T and WORK arrays, returns these
*> values as the first entries of the T and WORK arrays, and no error
@@ -295,9 +295,9 @@ SUBROUTINE SGELQ( M, N, A, LDA, T, TSIZE, WORK, LWORK,
T( 2 ) = MB
T( 3 ) = NB
IF( MINW ) THEN
- WORK( 1 ) = SROUNDUP_LWORK(LWMIN)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
ELSE
- WORK( 1 ) = SROUNDUP_LWORK(LWREQ)
+ WORK( 1 ) = SROUNDUP_LWORK( LWREQ )
END IF
END IF
IF( INFO.NE.0 ) THEN
@@ -322,7 +322,7 @@ SUBROUTINE SGELQ( M, N, A, LDA, T, TSIZE, WORK, LWORK,
$ LWORK, INFO )
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(LWREQ)
+ WORK( 1 ) = SROUNDUP_LWORK( LWREQ )
RETURN
*
* End of SGELQ
diff --git a/lapack-netlib/SRC/sgelqf.f b/lapack-netlib/SRC/sgelqf.f
index 1ceec4742d..3b3913d843 100644
--- a/lapack-netlib/SRC/sgelqf.f
+++ b/lapack-netlib/SRC/sgelqf.f
@@ -93,7 +93,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,M).
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M, otherwise.
*> For optimum performance LWORK >= M*NB, where NB is the
*> optimal blocksize.
*>
@@ -175,9 +176,8 @@ SUBROUTINE SGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
* Test the input arguments
*
INFO = 0
+ K = MIN( M, N )
NB = ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 )
- LWKOPT = M*NB
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -185,19 +185,25 @@ SUBROUTINE SGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
INFO = -2
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
- INFO = -7
+ ELSE IF( .NOT.LQUERY ) THEN
+ IF( LWORK.LE.0 .OR. ( N.GT.0 .AND. LWORK.LT.MAX( 1, M ) ) )
+ $ INFO = -7
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'SGELQF', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
+ IF( K.EQ.0 ) THEN
+ LWKOPT = 1
+ ELSE
+ LWKOPT = M*NB
+ END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
END IF
*
* Quick return if possible
*
- K = MIN( M, N )
IF( K.EQ.0 ) THEN
WORK( 1 ) = 1
RETURN
@@ -267,7 +273,7 @@ SUBROUTINE SGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
$ CALL SGELQ2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
$ IINFO )
*
- WORK( 1 ) = SROUNDUP_LWORK(IWS)
+ WORK( 1 ) = SROUNDUP_LWORK( IWS )
RETURN
*
* End of SGELQF
diff --git a/lapack-netlib/SRC/sgemlq.f b/lapack-netlib/SRC/sgemlq.f
index 83536825cc..7e4d9bf656 100644
--- a/lapack-netlib/SRC/sgemlq.f
+++ b/lapack-netlib/SRC/sgemlq.f
@@ -110,13 +110,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) REAL array, dimension (MAX(1,LWORK))
+*> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1, then a workspace query is assumed. The routine
*> only calculates the size of the WORK array, returns this
*> value as WORK(1), and no error message related to WORK
@@ -187,7 +188,7 @@ SUBROUTINE SGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
* ..
* .. Local Scalars ..
LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER MB, NB, LW, NBLCKS, MN
+ INTEGER MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -207,7 +208,7 @@ SUBROUTINE SGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Test the input arguments
*
- LQUERY = LWORK.EQ.-1
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'T' )
LEFT = LSAME( SIDE, 'L' )
@@ -222,6 +223,13 @@ SUBROUTINE SGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
LW = M * MB
MN = N
END IF
+*
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
*
IF( ( NB.GT.K ) .AND. ( MN.GT.K ) ) THEN
IF( MOD( MN - K, NB - K ) .EQ. 0 ) THEN
@@ -250,12 +258,12 @@ SUBROUTINE SGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
INFO = -9
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
INFO = -11
- ELSE IF( ( LWORK.LT.MAX( 1, LW ) ) .AND. ( .NOT.LQUERY ) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
INFO = -13
END IF
*
IF( INFO.EQ.0 ) THEN
- WORK( 1 ) = SROUNDUP_LWORK( LW )
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -267,7 +275,7 @@ SUBROUTINE SGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Quick return if possible
*
- IF( MIN( M, N, K ).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
*
@@ -280,7 +288,7 @@ SUBROUTINE SGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ MB, C, LDC, WORK, LWORK, INFO )
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK( LW )
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
*
RETURN
*
diff --git a/lapack-netlib/SRC/sgemqr.f b/lapack-netlib/SRC/sgemqr.f
index 3207f8bfd0..19bf467b8b 100644
--- a/lapack-netlib/SRC/sgemqr.f
+++ b/lapack-netlib/SRC/sgemqr.f
@@ -189,12 +189,13 @@ SUBROUTINE SGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
* ..
* .. Local Scalars ..
LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER MB, NB, LW, NBLCKS, MN
+ INTEGER MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
+ EXTERNAL LSAME
REAL SROUNDUP_LWORK
- EXTERNAL LSAME, SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL SGEMQRT, SLAMTSQR, XERBLA
@@ -206,7 +207,7 @@ SUBROUTINE SGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Test the input arguments
*
- LQUERY = LWORK.EQ.-1
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'T' )
LEFT = LSAME( SIDE, 'L' )
@@ -221,6 +222,13 @@ SUBROUTINE SGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
LW = MB * NB
MN = N
END IF
+*
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
*
IF( ( MB.GT.K ) .AND. ( MN.GT.K ) ) THEN
IF( MOD( MN - K, MB - K ).EQ.0 ) THEN
@@ -249,12 +257,12 @@ SUBROUTINE SGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
INFO = -9
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
INFO = -11
- ELSE IF( ( LWORK.LT.MAX( 1, LW ) ) .AND. ( .NOT.LQUERY ) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
INFO = -13
END IF
*
IF( INFO.EQ.0 ) THEN
- WORK( 1 ) = SROUNDUP_LWORK(LW)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -266,7 +274,7 @@ SUBROUTINE SGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Quick return if possible
*
- IF( MIN( M, N, K ).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
*
@@ -279,7 +287,7 @@ SUBROUTINE SGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ NB, C, LDC, WORK, LWORK, INFO )
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(LW)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
*
RETURN
*
diff --git a/lapack-netlib/SRC/sgeqlf.f b/lapack-netlib/SRC/sgeqlf.f
index b1266c89eb..14942b7652 100644
--- a/lapack-netlib/SRC/sgeqlf.f
+++ b/lapack-netlib/SRC/sgeqlf.f
@@ -88,7 +88,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,N).
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
*> For optimum performance LWORK >= N*NB, where NB is the
*> optimal blocksize.
*>
@@ -189,8 +190,9 @@ SUBROUTINE SGEQLF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
END IF
WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
*
- IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
- INFO = -7
+ IF( .NOT.LQUERY ) THEN
+ IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) )
+ $ INFO = -7
END IF
END IF
*
diff --git a/lapack-netlib/SRC/sgeqp3rk.f b/lapack-netlib/SRC/sgeqp3rk.f
index bb5da72dc2..d3a335b88e 100644
--- a/lapack-netlib/SRC/sgeqp3rk.f
+++ b/lapack-netlib/SRC/sgeqp3rk.f
@@ -427,7 +427,8 @@
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*. LWORK >= (3*N + NRHS - 1)
+*> LWORK >= 1, if MIN(M,N) = 0, and
+*> LWORK >= (3*N+NRHS-1), otherwise.
*> For optimal performance LWORK >= (2*N + NB*( N+NRHS+1 )),
*> where NB is the optimal block size for SGEQP3RK returned
*> by ILAENV. Minimal block size MINNB=2.
@@ -618,8 +619,9 @@ SUBROUTINE SGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
* .. External Functions ..
LOGICAL SISNAN
INTEGER ISAMAX, ILAENV
- REAL SLAMCH, SNRM2
- EXTERNAL SISNAN, SLAMCH, SNRM2, ISAMAX, ILAENV
+ REAL SLAMCH, SNRM2, SROUNDUP_LWORK
+ EXTERNAL SISNAN, SLAMCH, SNRM2, ISAMAX, ILAENV,
+ $ SROUNDUP_LWORK
* ..
* .. Intrinsic Functions ..
INTRINSIC REAL, MAX, MIN
@@ -696,7 +698,7 @@ SUBROUTINE SGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
*
LWKOPT = 2*N + NB*( N+NRHS+1 )
END IF
- WORK( 1 ) = REAL( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
IF( ( LWORK.LT.IWS ) .AND. .NOT.LQUERY ) THEN
INFO = -15
@@ -719,7 +721,7 @@ SUBROUTINE SGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
K = 0
MAXC2NRMK = ZERO
RELMAXC2NRMK = ZERO
- WORK( 1 ) = REAL( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
END IF
*
@@ -772,7 +774,7 @@ SUBROUTINE SGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
*
* Array TAU is not set and contains undefined elements.
*
- WORK( 1 ) = REAL( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
END IF
*
@@ -791,7 +793,7 @@ SUBROUTINE SGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
TAU( J ) = ZERO
END DO
*
- WORK( 1 ) = REAL( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
*
END IF
@@ -822,7 +824,7 @@ SUBROUTINE SGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
DO J = 1, MINMN
TAU( J ) = ZERO
END DO
- WORK( 1 ) = REAL( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
END IF
*
@@ -867,7 +869,7 @@ SUBROUTINE SGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
TAU( J ) = ZERO
END DO
*
- WORK( 1 ) = REAL( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
END IF
*
@@ -985,7 +987,7 @@ SUBROUTINE SGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
*
* Return from the routine.
*
- WORK( 1 ) = REAL( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
@@ -1072,7 +1074,7 @@ SUBROUTINE SGEQP3RK( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
*
END IF
*
- WORK( 1 ) = REAL( LWKOPT )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/sgeqr.f b/lapack-netlib/SRC/sgeqr.f
index 6f41a92ead..79a515e1c8 100644
--- a/lapack-netlib/SRC/sgeqr.f
+++ b/lapack-netlib/SRC/sgeqr.f
@@ -99,7 +99,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1 or -2, then a workspace query is assumed. The routine
*> only calculates the sizes of the T and WORK arrays, returns these
*> values as the first entries of the T and WORK arrays, and no error
@@ -168,6 +168,8 @@
*>
*> \endverbatim
*>
+*> \ingroup geqr
+*>
* =====================================================================
SUBROUTINE SGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
$ INFO )
@@ -188,11 +190,13 @@ SUBROUTINE SGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, LMINWS, MINT, MINW
- INTEGER MB, NB, MINTSZ, NBLCKS
+ INTEGER MB, NB, MINTSZ, NBLCKS, LWMIN, LWREQ
* ..
* .. External Functions ..
LOGICAL LSAME
EXTERNAL LSAME
+ REAL SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL SLATSQR, SGEQRT, XERBLA
@@ -244,8 +248,10 @@ SUBROUTINE SGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
*
* Determine if the workspace size satisfies minimal size
*
+ LWMIN = MAX( 1, N )
+ LWREQ = MAX( 1, N*NB )
LMINWS = .FALSE.
- IF( ( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) .OR. LWORK.LT.NB*N )
+ IF( ( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) .OR. LWORK.LT.LWREQ )
$ .AND. ( LWORK.GE.N ) .AND. ( TSIZE.GE.MINTSZ )
$ .AND. ( .NOT.LQUERY ) ) THEN
IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) ) THEN
@@ -253,7 +259,7 @@ SUBROUTINE SGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
NB = 1
MB = M
END IF
- IF( LWORK.LT.NB*N ) THEN
+ IF( LWORK.LT.LWREQ ) THEN
LMINWS = .TRUE.
NB = 1
END IF
@@ -268,7 +274,7 @@ SUBROUTINE SGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
ELSE IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 )
$ .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
INFO = -6
- ELSE IF( ( LWORK.LT.MAX( 1, N*NB ) ) .AND. ( .NOT.LQUERY )
+ ELSE IF( ( LWORK.LT.LWREQ ) .AND. ( .NOT.LQUERY )
$ .AND. ( .NOT.LMINWS ) ) THEN
INFO = -8
END IF
@@ -282,9 +288,9 @@ SUBROUTINE SGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
T( 2 ) = MB
T( 3 ) = NB
IF( MINW ) THEN
- WORK( 1 ) = MAX( 1, N )
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
ELSE
- WORK( 1 ) = MAX( 1, NB*N )
+ WORK( 1 ) = SROUNDUP_LWORK( LWREQ )
END IF
END IF
IF( INFO.NE.0 ) THEN
@@ -309,7 +315,7 @@ SUBROUTINE SGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
$ LWORK, INFO )
END IF
*
- WORK( 1 ) = MAX( 1, NB*N )
+ WORK( 1 ) = SROUNDUP_LWORK( LWREQ )
*
RETURN
*
diff --git a/lapack-netlib/SRC/sgeqrfp.f b/lapack-netlib/SRC/sgeqrfp.f
index d1ee2a8283..37747c5124 100644
--- a/lapack-netlib/SRC/sgeqrfp.f
+++ b/lapack-netlib/SRC/sgeqrfp.f
@@ -97,7 +97,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,N).
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
*> For optimum performance LWORK >= N*NB, where NB is
*> the optimal blocksize.
*>
@@ -162,8 +163,8 @@ SUBROUTINE SGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
* .. Local Scalars ..
LOGICAL LQUERY
- INTEGER I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
- $ NBMIN, NX
+ INTEGER I, IB, IINFO, IWS, K, LDWORK, LWKMIN, LWKOPT,
+ $ NB, NBMIN, NX
* ..
* .. External Subroutines ..
EXTERNAL SGEQR2P, SLARFB, SLARFT, XERBLA
@@ -173,8 +174,9 @@ SUBROUTINE SGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
* ..
* .. External Functions ..
INTEGER ILAENV
+ EXTERNAL ILAENV
REAL SROUNDUP_LWORK
- EXTERNAL ILAENV, SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
* ..
* .. Executable Statements ..
*
@@ -182,8 +184,16 @@ SUBROUTINE SGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
INFO = 0
NB = ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
- LWKOPT = N*NB
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ K = MIN( M, N )
+ IF( K.EQ.0 ) THEN
+ LWKMIN = 1
+ LWKOPT = 1
+ ELSE
+ LWKMIN = N
+ LWKOPT = N*NB
+ END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
+*
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -191,7 +201,7 @@ SUBROUTINE SGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
INFO = -2
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -7
END IF
IF( INFO.NE.0 ) THEN
@@ -211,7 +221,7 @@ SUBROUTINE SGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
NBMIN = 2
NX = 0
- IWS = N
+ IWS = LWKMIN
IF( NB.GT.1 .AND. NB.LT.K ) THEN
*
* Determine when to cross over from blocked to unblocked code.
@@ -273,7 +283,7 @@ SUBROUTINE SGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
$ CALL SGEQR2P( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
$ IINFO )
*
- WORK( 1 ) = SROUNDUP_LWORK(IWS)
+ WORK( 1 ) = SROUNDUP_LWORK( IWS )
RETURN
*
* End of SGEQRFP
diff --git a/lapack-netlib/SRC/sgesvj.f b/lapack-netlib/SRC/sgesvj.f
index 3f53a5a152..36aed2853c 100644
--- a/lapack-netlib/SRC/sgesvj.f
+++ b/lapack-netlib/SRC/sgesvj.f
@@ -208,7 +208,7 @@
*>
*> \param[in,out] WORK
*> \verbatim
-*> WORK is REAL array, dimension (LWORK)
+*> WORK is REAL array, dimension (MAX(1,LWORK))
*> On entry,
*> If JOBU = 'C' :
*> WORK(1) = CTOL, where CTOL defines the threshold for convergence.
@@ -239,7 +239,12 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> length of WORK, WORK >= MAX(6,M+N)
+*> Length of WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MAX(6,M+N), otherwise.
+*>
+*> If on entry LWORK = -1, then a workspace query is assumed and
+*> no computation is done; WORK(1) is set to the minial (and optimal)
+*> length of WORK.
*> \endverbatim
*>
*> \param[out] INFO
@@ -260,7 +265,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup realGEcomputational
+*> \ingroup gesvj
*
*> \par Further Details:
* =====================
@@ -351,9 +356,9 @@ SUBROUTINE SGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
$ ISWROT, jbc, jgl, KBL, LKAHEAD, MVL, N2, N34,
$ N4, NBL, NOTROT, p, PSKIPPED, q, ROWSKIP,
- $ SWBAND
- LOGICAL APPLV, GOSCALE, LOWER, LSVEC, NOSCALE, ROTOK,
- $ RSVEC, UCTOL, UPPER
+ $ SWBAND, MINMN, LWMIN
+ LOGICAL APPLV, GOSCALE, LOWER, LQUERY, LSVEC, NOSCALE,
+ $ ROTOK, RSVEC, UCTOL, UPPER
* ..
* .. Local Arrays ..
REAL FASTR( 5 )
@@ -369,8 +374,8 @@ SUBROUTINE SGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
INTEGER ISAMAX
EXTERNAL ISAMAX
* from LAPACK
- REAL SLAMCH
- EXTERNAL SLAMCH
+ REAL SLAMCH, SROUNDUP_LWORK
+ EXTERNAL SLAMCH, SROUNDUP_LWORK
LOGICAL LSAME
EXTERNAL LSAME
* ..
@@ -394,6 +399,14 @@ SUBROUTINE SGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
UPPER = LSAME( JOBA, 'U' )
LOWER = LSAME( JOBA, 'L' )
*
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 6, M+N )
+ END IF
+*
+ LQUERY = ( LWORK.EQ.-1 )
IF( .NOT.( UPPER .OR. LOWER .OR. LSAME( JOBA, 'G' ) ) ) THEN
INFO = -1
ELSE IF( .NOT.( LSVEC .OR. UCTOL .OR. LSAME( JOBU, 'N' ) ) ) THEN
@@ -413,7 +426,7 @@ SUBROUTINE SGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
INFO = -11
ELSE IF( UCTOL .AND. ( WORK( 1 ).LE.ONE ) ) THEN
INFO = -12
- ELSE IF( LWORK.LT.MAX( M+N, 6 ) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. ( .NOT.LQUERY ) ) THEN
INFO = -13
ELSE
INFO = 0
@@ -423,11 +436,14 @@ SUBROUTINE SGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'SGESVJ', -INFO )
RETURN
+ ELSE IF( LQUERY ) THEN
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
+ RETURN
END IF
*
* #:) Quick return for void matrix
*
- IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )RETURN
+ IF( MINMN.EQ.0 ) RETURN
*
* Set numerical parameters
* The stopping criterion for Jacobi rotations is
diff --git a/lapack-netlib/SRC/sgetri.f b/lapack-netlib/SRC/sgetri.f
index fe71bc4a52..7b06bb63db 100644
--- a/lapack-netlib/SRC/sgetri.f
+++ b/lapack-netlib/SRC/sgetri.f
@@ -137,8 +137,9 @@ SUBROUTINE SGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
* ..
* .. External Functions ..
INTEGER ILAENV
+ EXTERNAL ILAENV
REAL SROUNDUP_LWORK
- EXTERNAL ILAENV, SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL SGEMM, SGEMV, SSWAP, STRSM, STRTRI, XERBLA
@@ -152,8 +153,9 @@ SUBROUTINE SGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
*
INFO = 0
NB = ILAENV( 1, 'SGETRI', ' ', N, -1, -1, -1 )
- LWKOPT = N*NB
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ LWKOPT = MAX( 1, N*NB )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
+*
LQUERY = ( LWORK.EQ.-1 )
IF( N.LT.0 ) THEN
INFO = -1
@@ -251,7 +253,7 @@ SUBROUTINE SGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
$ CALL SSWAP( N, A( 1, J ), 1, A( 1, JP ), 1 )
60 CONTINUE
*
- WORK( 1 ) = SROUNDUP_LWORK(IWS)
+ WORK( 1 ) = SROUNDUP_LWORK( IWS )
RETURN
*
* End of SGETRI
diff --git a/lapack-netlib/SRC/sgetsls.f b/lapack-netlib/SRC/sgetsls.f
index d89c6a4e6d..08a427a8b3 100644
--- a/lapack-netlib/SRC/sgetsls.f
+++ b/lapack-netlib/SRC/sgetsls.f
@@ -127,7 +127,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1 or -2, then a workspace query is assumed.
*> If LWORK = -1, the routine calculates optimal size of WORK for the
*> optimal performance and returns this value in WORK(1).
@@ -226,7 +226,10 @@ SUBROUTINE SGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
*
* Determine the optimum and minimum LWORK
*
- IF( M.GE.N ) THEN
+ IF( MIN( M, N, NRHS ).EQ.0 ) THEN
+ WSIZEO = 1
+ WSIZEM = 1
+ ELSE IF( M.GE.N ) THEN
CALL SGEQR( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 )
TSZO = INT( TQ( 1 ) )
LWO = INT( WORKQ( 1 ) )
diff --git a/lapack-netlib/SRC/sgetsqrhrt.f b/lapack-netlib/SRC/sgetsqrhrt.f
index d80ff4da81..7ade8a66c1 100644
--- a/lapack-netlib/SRC/sgetsqrhrt.f
+++ b/lapack-netlib/SRC/sgetsqrhrt.f
@@ -130,14 +130,17 @@
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The dimension of the array WORK.
-*> LWORK >= MAX( LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) ),
+*> If MIN(M,N) = 0, LWORK >= 1, else
+*> LWORK >= MAX( 1, LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) ),
*> where
*> NUM_ALL_ROW_BLOCKS = CEIL((M-N)/(MB1-N)),
*> NB1LOCAL = MIN(NB1,N).
*> LWT = NUM_ALL_ROW_BLOCKS * N * NB1LOCAL,
*> LW1 = NB1LOCAL * N,
-*> LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) ),
+*> LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) ).
+*>
*> If LWORK = -1, then a workspace query is assumed.
*> The routine only calculates the optimal size of the WORK
*> array, returns this value as the first entry of the WORK
@@ -216,7 +219,7 @@ SUBROUTINE SGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
* Test the input arguments
*
INFO = 0
- LQUERY = LWORK.EQ.-1
+ LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
ELSE IF( N.LT.0 .OR. M.LT.N ) THEN
@@ -229,7 +232,7 @@ SUBROUTINE SGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
INFO = -5
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -7
- ELSE IF( LDT.LT.MAX( 1, MIN( NB2, N ) ) ) THEN
+ ELSE IF( LDT.LT.MAX( 1, MIN( NB2, N ) ) ) THEN
INFO = -9
ELSE
*
@@ -267,8 +270,9 @@ SUBROUTINE SGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) )
*
LWORKOPT = MAX( LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) )
+ LWORKOPT = MAX( 1, LWORKOPT )
*
- IF( ( LWORK.LT.MAX( 1, LWORKOPT ) ).AND.(.NOT.LQUERY) ) THEN
+ IF( LWORK.LT.LWORKOPT .AND. .NOT.LQUERY ) THEN
INFO = -11
END IF
*
@@ -350,4 +354,4 @@ SUBROUTINE SGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
*
* End of SGETSQRHRT
*
- END
\ No newline at end of file
+ END
diff --git a/lapack-netlib/SRC/sgges3.f b/lapack-netlib/SRC/sgges3.f
index e35d4955a5..e90cd6947e 100644
--- a/lapack-netlib/SRC/sgges3.f
+++ b/lapack-netlib/SRC/sgges3.f
@@ -234,6 +234,8 @@
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
+*> If N = 0, LWORK >= 1, else LWORK >= 6*N+16.
+*> For good performance, LWORK must generally be larger.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -309,7 +311,8 @@ SUBROUTINE SGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
$ LQUERY, LST2SL, WANTST
INTEGER I, ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT,
- $ ILO, IP, IRIGHT, IROWS, ITAU, IWRK, LWKOPT
+ $ ILO, IP, IRIGHT, IROWS, ITAU, IWRK, LWKOPT,
+ $ LWKMIN
REAL ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PVSL,
$ PVSR, SAFMAX, SAFMIN, SMLNUM
* ..
@@ -361,6 +364,12 @@ SUBROUTINE SGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
*
INFO = 0
LQUERY = ( LWORK.EQ.-1 )
+ IF( N.EQ.0 ) THEN
+ LWKMIN = 1
+ ELSE
+ LWKMIN = 6*N+16
+ END IF
+*
IF( IJOBVL.LE.0 ) THEN
INFO = -1
ELSE IF( IJOBVR.LE.0 ) THEN
@@ -377,7 +386,7 @@ SUBROUTINE SGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
INFO = -15
ELSE IF( LDVSR.LT.1 .OR. ( ILVSR .AND. LDVSR.LT.N ) ) THEN
INFO = -17
- ELSE IF( LWORK.LT.6*N+16 .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -19
END IF
*
@@ -385,7 +394,7 @@ SUBROUTINE SGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
*
IF( INFO.EQ.0 ) THEN
CALL SGEQRF( N, N, B, LDB, WORK, WORK, -1, IERR )
- LWKOPT = MAX( 6*N+16, 3*N+INT( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKMIN, 3*N+INT( WORK( 1 ) ) )
CALL SORMQR( 'L', 'T', N, N, N, B, LDB, WORK, A, LDA, WORK,
$ -1, IERR )
LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
@@ -407,7 +416,11 @@ SUBROUTINE SGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
$ IERR )
LWKOPT = MAX( LWKOPT, 2*N+INT( WORK( 1 ) ) )
END IF
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ IF( N.EQ.0 ) THEN
+ WORK( 1 ) = 1
+ ELSE
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
+ END IF
END IF
*
IF( INFO.NE.0 ) THEN
@@ -421,6 +434,7 @@ SUBROUTINE SGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
*
IF( N.EQ.0 ) THEN
SDIM = 0
+ WORK( 1 ) = 1
RETURN
END IF
*
@@ -657,7 +671,7 @@ SUBROUTINE SGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
*
40 CONTINUE
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/sggev3.f b/lapack-netlib/SRC/sggev3.f
index c82d2187f5..d788d11472 100644
--- a/lapack-netlib/SRC/sggev3.f
+++ b/lapack-netlib/SRC/sggev3.f
@@ -189,6 +189,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
+*> The dimension of the array WORK. LWORK >= MAX(1,8*N).
+*> For good performance, LWORK should generally be larger.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -248,7 +250,8 @@ SUBROUTINE SGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
LOGICAL ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
CHARACTER CHTEMP
INTEGER ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
- $ IN, IRIGHT, IROWS, ITAU, IWRK, JC, JR, LWKOPT
+ $ IN, IRIGHT, IROWS, ITAU, IWRK, JC, JR, LWKOPT,
+ $ LWKMIN
REAL ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
$ SMLNUM, TEMP
* ..
@@ -298,6 +301,7 @@ SUBROUTINE SGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
*
INFO = 0
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 8*N )
IF( IJOBVL.LE.0 ) THEN
INFO = -1
ELSE IF( IJOBVR.LE.0 ) THEN
@@ -312,7 +316,7 @@ SUBROUTINE SGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
INFO = -12
ELSE IF( LDVR.LT.1 .OR. ( ILVR .AND. LDVR.LT.N ) ) THEN
INFO = -14
- ELSE IF( LWORK.LT.MAX( 1, 8*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -16
END IF
*
@@ -320,28 +324,31 @@ SUBROUTINE SGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
*
IF( INFO.EQ.0 ) THEN
CALL SGEQRF( N, N, B, LDB, WORK, WORK, -1, IERR )
- LWKOPT = MAX( 1, 8*N, 3*N+INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKMIN, 3*N+INT( WORK( 1 ) ) )
CALL SORMQR( 'L', 'T', N, N, N, B, LDB, WORK, A, LDA, WORK,
$ -1, IERR )
- LWKOPT = MAX( LWKOPT, 3*N+INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
CALL SGGHD3( JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB, VL, LDVL,
$ VR, LDVR, WORK, -1, IERR )
- LWKOPT = MAX( LWKOPT, 3*N+INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
IF( ILVL ) THEN
CALL SORGQR( N, N, N, VL, LDVL, WORK, WORK, -1, IERR )
- LWKOPT = MAX( LWKOPT, 3*N+INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
CALL SLAQZ0( 'S', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB,
$ ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR,
$ WORK, -1, 0, IERR )
- LWKOPT = MAX( LWKOPT, 2*N+INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 2*N+INT( WORK( 1 ) ) )
ELSE
CALL SLAQZ0( 'E', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB,
$ ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR,
$ WORK, -1, 0, IERR )
- LWKOPT = MAX( LWKOPT, 2*N+INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, 2*N+INT( WORK( 1 ) ) )
+ END IF
+ IF( N.EQ.0 ) THEN
+ WORK( 1 ) = 1
+ ELSE
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
- WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
-*
END IF
*
IF( INFO.NE.0 ) THEN
diff --git a/lapack-netlib/SRC/sgghd3.f b/lapack-netlib/SRC/sgghd3.f
index 9c5858b5a5..01e57088ad 100644
--- a/lapack-netlib/SRC/sgghd3.f
+++ b/lapack-netlib/SRC/sgghd3.f
@@ -179,14 +179,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is REAL array, dimension (LWORK)
+*> WORK is REAL array, dimension (MAX(1,LWORK))
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
-*> \param[in] LWORK
+*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of the array WORK. LWORK >= 1.
+*> The length of the array WORK. LWORK >= 1.
*> For optimum performance LWORK >= 6*N*NB, where NB is the
*> optimal blocksize.
*>
@@ -276,7 +276,12 @@ SUBROUTINE SGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
*
INFO = 0
NB = ILAENV( 1, 'SGGHD3', ' ', N, ILO, IHI, -1 )
- LWKOPT = MAX( 6*N*NB, 1 )
+ NH = IHI - ILO + 1
+ IF( NH.LE.1 ) THEN
+ LWKOPT = 1
+ ELSE
+ LWKOPT = 6*N*NB
+ END IF
WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
INITQ = LSAME( COMPQ, 'I' )
WANTQ = INITQ .OR. LSAME( COMPQ, 'V' )
@@ -326,7 +331,6 @@ SUBROUTINE SGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
*
* Quick return if possible
*
- NH = IHI - ILO + 1
IF( NH.LE.1 ) THEN
WORK( 1 ) = ONE
RETURN
@@ -886,6 +890,7 @@ SUBROUTINE SGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
IF ( JCOL.LT.IHI )
$ CALL SGGHRD( COMPQ2, COMPZ2, N, JCOL, IHI, A, LDA, B, LDB, Q,
$ LDQ, Z, LDZ, IERR )
+*
WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
diff --git a/lapack-netlib/SRC/sggqrf.f b/lapack-netlib/SRC/sggqrf.f
index ebb42a8998..d32b484100 100644
--- a/lapack-netlib/SRC/sggqrf.f
+++ b/lapack-netlib/SRC/sggqrf.f
@@ -236,8 +236,9 @@ SUBROUTINE SGGQRF( N, M, P, A, LDA, TAUA, B, LDB, TAUB, WORK,
* ..
* .. External Functions ..
INTEGER ILAENV
+ EXTERNAL ILAENV
REAL SROUNDUP_LWORK
- EXTERNAL ILAENV, SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
* ..
* .. Intrinsic Functions ..
INTRINSIC INT, MAX, MIN
@@ -251,8 +252,9 @@ SUBROUTINE SGGQRF( N, M, P, A, LDA, TAUA, B, LDB, TAUB, WORK,
NB2 = ILAENV( 1, 'SGERQF', ' ', N, P, -1, -1 )
NB3 = ILAENV( 1, 'SORMQR', ' ', N, M, P, -1 )
NB = MAX( NB1, NB2, NB3 )
- LWKOPT = MAX( N, M, P )*NB
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ LWKOPT = MAX( 1, MAX( N, M, P )*NB )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
+*
LQUERY = ( LWORK.EQ.-1 )
IF( N.LT.0 ) THEN
INFO = -1
@@ -289,6 +291,7 @@ SUBROUTINE SGGQRF( N, M, P, A, LDA, TAUA, B, LDB, TAUB, WORK,
*
CALL SGERQF( N, P, B, LDB, TAUB, WORK, LWORK, INFO )
LWKOPT = MAX( LOPT, INT( WORK( 1 ) ) )
+*
WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
diff --git a/lapack-netlib/SRC/sggrqf.f b/lapack-netlib/SRC/sggrqf.f
index 2163f1ef8e..b3842ec2ab 100644
--- a/lapack-netlib/SRC/sggrqf.f
+++ b/lapack-netlib/SRC/sggrqf.f
@@ -250,7 +250,7 @@ SUBROUTINE SGGRQF( M, P, N, A, LDA, TAUA, B, LDB, TAUB, WORK,
NB2 = ILAENV( 1, 'SGEQRF', ' ', P, N, -1, -1 )
NB3 = ILAENV( 1, 'SORMRQ', ' ', M, N, P, -1 )
NB = MAX( NB1, NB2, NB3 )
- LWKOPT = MAX( N, M, P)*NB
+ LWKOPT = MAX( 1, MAX( N, M, P )*NB )
WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
diff --git a/lapack-netlib/SRC/sggsvd3.f b/lapack-netlib/SRC/sggsvd3.f
index 053fff5de1..cee630593e 100644
--- a/lapack-netlib/SRC/sggsvd3.f
+++ b/lapack-netlib/SRC/sggsvd3.f
@@ -278,7 +278,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
diff --git a/lapack-netlib/SRC/sggsvp3.f b/lapack-netlib/SRC/sggsvp3.f
index a463b9064e..8e90d770cc 100644
--- a/lapack-netlib/SRC/sggsvp3.f
+++ b/lapack-netlib/SRC/sggsvp3.f
@@ -227,7 +227,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -300,8 +300,9 @@ SUBROUTINE SGGSVP3( JOBU, JOBV, JOBQ, M, P, N, A, LDA, B, LDB,
* ..
* .. External Functions ..
LOGICAL LSAME
+ EXTERNAL LSAME
REAL SROUNDUP_LWORK
- EXTERNAL LSAME, SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL SGEQP3, SGEQR2, SGERQ2, SLACPY, SLAPMT,
diff --git a/lapack-netlib/SRC/slamswlq.f b/lapack-netlib/SRC/slamswlq.f
index d4996b1f20..432afadedf 100644
--- a/lapack-netlib/SRC/slamswlq.f
+++ b/lapack-netlib/SRC/slamswlq.f
@@ -127,17 +127,20 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) REAL array, dimension (MAX(1,LWORK))
+*> (workspace) REAL array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*> If SIDE = 'L', LWORK >= max(1,NB) * MB;
-*> if SIDE = 'R', LWORK >= max(1,M) * MB.
+*>
+*> If MIN(M,N,K) = 0, LWORK >= 1.
+*> If SIDE = 'L', LWORK >= max(1,NB*MB).
+*> If SIDE = 'R', LWORK >= max(1,M*MB).
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
*> \endverbatim
@@ -189,33 +192,38 @@
*> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
*> \endverbatim
*>
+*> \ingroup lamswlq
+*>
* =====================================================================
SUBROUTINE SLAMSWLQ( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
- $ LDT, C, LDC, WORK, LWORK, INFO )
+ $ LDT, C, LDC, WORK, LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*
* .. Scalar Arguments ..
- CHARACTER SIDE, TRANS
- INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
+ CHARACTER SIDE, TRANS
+ INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
* ..
* .. Array Arguments ..
- REAL A( LDA, * ), WORK( * ), C(LDC, * ),
- $ T( LDT, * )
+ REAL A( LDA, * ), WORK( * ), C( LDC, * ),
+ $ T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER I, II, KK, LW, CTR
+ LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
+ INTEGER I, II, KK, LW, CTR, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
EXTERNAL LSAME
+ REAL SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
+* ..
* .. External Subroutines ..
EXTERNAL STPMLQT, SGEMLQT, XERBLA
* ..
@@ -223,52 +231,60 @@ SUBROUTINE SLAMSWLQ( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
*
* Test the input arguments
*
- LQUERY = LWORK.LT.0
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'T' )
LEFT = LSAME( SIDE, 'L' )
RIGHT = LSAME( SIDE, 'R' )
- IF (LEFT) THEN
+ IF( LEFT ) THEN
LW = N * MB
ELSE
LW = M * MB
END IF
+*
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
*
INFO = 0
IF( .NOT.LEFT .AND. .NOT.RIGHT ) THEN
- INFO = -1
+ INFO = -1
ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN
- INFO = -2
+ INFO = -2
ELSE IF( K.LT.0 ) THEN
INFO = -5
ELSE IF( M.LT.K ) THEN
INFO = -3
ELSE IF( N.LT.0 ) THEN
INFO = -4
- ELSE IF( K.LT.MB .OR. MB.LT.1) THEN
+ ELSE IF( K.LT.MB .OR. MB.LT.1 ) THEN
INFO = -6
ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
INFO = -9
- ELSE IF( LDT.LT.MAX( 1, MB) ) THEN
+ ELSE IF( LDT.LT.MAX( 1, MB ) ) THEN
INFO = -11
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
- INFO = -13
- ELSE IF(( LWORK.LT.MAX(1,LW)).AND.(.NOT.LQUERY)) THEN
+ INFO = -13
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -15
END IF
*
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
+ END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'SLAMSWLQ', -INFO )
- WORK(1) = LW
RETURN
- ELSE IF (LQUERY) THEN
- WORK(1) = LW
+ ELSE IF( LQUERY ) THEN
RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N,K).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
*
@@ -402,7 +418,7 @@ SUBROUTINE SLAMSWLQ( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
*
END IF
*
- WORK(1) = LW
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of SLAMSWLQ
diff --git a/lapack-netlib/SRC/slamtsqr.f b/lapack-netlib/SRC/slamtsqr.f
index 960b794de8..f9b167aea3 100644
--- a/lapack-netlib/SRC/slamtsqr.f
+++ b/lapack-netlib/SRC/slamtsqr.f
@@ -128,22 +128,24 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) REAL array, dimension (MAX(1,LWORK))
-*>
+*> (workspace) REAL array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
+*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
+*> If MIN(M,N,K) = 0, LWORK >= 1.
+*> If SIDE = 'L', LWORK >= max(1,N*NB).
+*> If SIDE = 'R', LWORK >= max(1,MB*NB).
*>
-*> If SIDE = 'L', LWORK >= max(1,N)*NB;
-*> if SIDE = 'R', LWORK >= max(1,MB)*NB.
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
-*>
*> \endverbatim
+*>
*> \param[out] INFO
*> \verbatim
*> INFO is INTEGER
@@ -191,33 +193,38 @@
*> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
*> \endverbatim
*>
+*> \ingroup lamtsqr
+*>
* =====================================================================
SUBROUTINE SLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
- $ LDT, C, LDC, WORK, LWORK, INFO )
+ $ LDT, C, LDC, WORK, LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*
* .. Scalar Arguments ..
- CHARACTER SIDE, TRANS
- INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
+ CHARACTER SIDE, TRANS
+ INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
* ..
* .. Array Arguments ..
- REAL A( LDA, * ), WORK( * ), C(LDC, * ),
- $ T( LDT, * )
+ REAL A( LDA, * ), WORK( * ), C( LDC, * ),
+ $ T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER I, II, KK, LW, CTR, Q
+ LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
+ INTEGER I, II, KK, LW, CTR, Q, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
EXTERNAL LSAME
+ REAL SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
+* ..
* .. External Subroutines ..
EXTERNAL SGEMQRT, STPMQRT, XERBLA
* ..
@@ -225,12 +232,13 @@ SUBROUTINE SLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
*
* Test the input arguments
*
- LQUERY = LWORK.LT.0
+ INFO = 0
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'T' )
LEFT = LSAME( SIDE, 'L' )
RIGHT = LSAME( SIDE, 'R' )
- IF (LEFT) THEN
+ IF( LEFT ) THEN
LW = N * NB
Q = M
ELSE
@@ -238,11 +246,17 @@ SUBROUTINE SLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
Q = N
END IF
*
- INFO = 0
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
+*
IF( .NOT.LEFT .AND. .NOT.RIGHT ) THEN
- INFO = -1
+ INFO = -1
ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN
- INFO = -2
+ INFO = -2
ELSE IF( M.LT.K ) THEN
INFO = -3
ELSE IF( N.LT.0 ) THEN
@@ -253,38 +267,38 @@ SUBROUTINE SLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
INFO = -7
ELSE IF( LDA.LT.MAX( 1, Q ) ) THEN
INFO = -9
- ELSE IF( LDT.LT.MAX( 1, NB) ) THEN
+ ELSE IF( LDT.LT.MAX( 1, NB ) ) THEN
INFO = -11
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
- INFO = -13
- ELSE IF(( LWORK.LT.MAX(1,LW)).AND.(.NOT.LQUERY)) THEN
+ INFO = -13
+ ELSE IF( LWORK.LT.LWMIN. AND. (.NOT.LQUERY) ) THEN
INFO = -15
END IF
*
-* Determine the block size if it is tall skinny or short and wide
-*
- IF( INFO.EQ.0) THEN
- WORK(1) = LW
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'SLAMTSQR', -INFO )
RETURN
- ELSE IF (LQUERY) THEN
- RETURN
+ ELSE IF( LQUERY ) THEN
+ RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N,K).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
+*
+* Determine the block size if it is tall skinny or short and wide
*
IF((MB.LE.K).OR.(MB.GE.MAX(M,N,K))) THEN
CALL SGEMQRT( SIDE, TRANS, M, N, K, NB, A, LDA,
- $ T, LDT, C, LDC, WORK, INFO)
+ $ T, LDT, C, LDC, WORK, INFO )
RETURN
- END IF
+ END IF
*
IF(LEFT.AND.NOTRAN) THEN
*
@@ -410,7 +424,7 @@ SUBROUTINE SLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
*
END IF
*
- WORK(1) = LW
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of SLAMTSQR
diff --git a/lapack-netlib/SRC/slaswlq.f b/lapack-netlib/SRC/slaswlq.f
index 685f823a0e..594c646db3 100644
--- a/lapack-netlib/SRC/slaswlq.f
+++ b/lapack-netlib/SRC/slaswlq.f
@@ -96,22 +96,24 @@
*> The leading dimension of the array T. LDT >= MB.
*> \endverbatim
*>
-*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) REAL array, dimension (MAX(1,LWORK))
-*>
+*> (workspace) REAL array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
+*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= MB * M.
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MB*M, otherwise.
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
-*>
*> \endverbatim
+
*> \param[out] INFO
*> \verbatim
*> INFO is INTEGER
@@ -163,32 +165,35 @@
*>
* =====================================================================
SUBROUTINE SLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
- $ INFO)
+ $ INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. --
*
* .. Scalar Arguments ..
- INTEGER INFO, LDA, M, N, MB, NB, LWORK, LDT
+ INTEGER INFO, LDA, M, N, MB, NB, LWORK, LDT
* ..
* .. Array Arguments ..
- REAL A( LDA, * ), WORK( * ), T( LDT, *)
+ REAL A( LDA, * ), WORK( * ), T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LQUERY
- INTEGER I, II, KK, CTR
+ LOGICAL LQUERY
+ INTEGER I, II, KK, CTR, MINMN, LWMIN
* ..
* .. EXTERNAL FUNCTIONS ..
LOGICAL LSAME
+ EXTERNAL LSAME
REAL SROUNDUP_LWORK
- EXTERNAL LSAME, SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
+* ..
* .. EXTERNAL SUBROUTINES ..
EXTERNAL SGELQT, SGEQRT, STPLQT, STPQRT, XERBLA
+* ..
* .. INTRINSIC FUNCTIONS ..
INTRINSIC MAX, MIN, MOD
* ..
@@ -199,12 +204,19 @@ SUBROUTINE SLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
INFO = 0
*
LQUERY = ( LWORK.EQ.-1 )
+*
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = M*MB
+ END IF
*
IF( M.LT.0 ) THEN
INFO = -1
ELSE IF( N.LT.0 .OR. N.LT.M ) THEN
INFO = -2
- ELSE IF( MB.LT.1 .OR. ( MB.GT.M .AND. M.GT.0 )) THEN
+ ELSE IF( MB.LT.1 .OR. ( MB.GT.M .AND. M.GT.0 ) ) THEN
INFO = -3
ELSE IF( NB.LE.0 ) THEN
INFO = -4
@@ -212,60 +224,60 @@ SUBROUTINE SLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
INFO = -6
ELSE IF( LDT.LT.MB ) THEN
INFO = -8
- ELSE IF( ( LWORK.LT.M*MB) .AND. (.NOT.LQUERY) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -10
END IF
- IF( INFO.EQ.0) THEN
- WORK(1) = MB*M
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'SLASWLQ', -INFO )
RETURN
- ELSE IF (LQUERY) THEN
- RETURN
+ ELSE IF( LQUERY ) THEN
+ RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N).EQ.0 ) THEN
- RETURN
+ IF( MINMN.EQ.0 ) THEN
+ RETURN
END IF
*
* The LQ Decomposition
*
- IF((M.GE.N).OR.(NB.LE.M).OR.(NB.GE.N)) THEN
- CALL SGELQT( M, N, MB, A, LDA, T, LDT, WORK, INFO)
+ IF( (M.GE.N) .OR. (NB.LE.M) .OR. (NB.GE.N) ) THEN
+ CALL SGELQT( M, N, MB, A, LDA, T, LDT, WORK, INFO )
RETURN
- END IF
+ END IF
*
- KK = MOD((N-M),(NB-M))
- II=N-KK+1
+ KK = MOD((N-M),(NB-M))
+ II = N-KK+1
*
-* Compute the LQ factorization of the first block A(1:M,1:NB)
+* Compute the LQ factorization of the first block A(1:M,1:NB)
*
- CALL SGELQT( M, NB, MB, A(1,1), LDA, T, LDT, WORK, INFO)
- CTR = 1
+ CALL SGELQT( M, NB, MB, A(1,1), LDA, T, LDT, WORK, INFO )
+ CTR = 1
*
- DO I = NB+1, II-NB+M , (NB-M)
+ DO I = NB+1, II-NB+M, (NB-M)
*
-* Compute the QR factorization of the current block A(1:M,I:I+NB-M)
+* Compute the QR factorization of the current block A(1:M,I:I+NB-M)
*
- CALL STPLQT( M, NB-M, 0, MB, A(1,1), LDA, A( 1, I ),
- $ LDA, T(1, CTR * M + 1),
- $ LDT, WORK, INFO )
- CTR = CTR + 1
- END DO
+ CALL STPLQT( M, NB-M, 0, MB, A(1,1), LDA, A( 1, I ),
+ $ LDA, T(1, CTR * M + 1),
+ $ LDT, WORK, INFO )
+ CTR = CTR + 1
+ END DO
*
* Compute the QR factorization of the last block A(1:M,II:N)
*
- IF (II.LE.N) THEN
+ IF( II.LE.N ) THEN
CALL STPLQT( M, KK, 0, MB, A(1,1), LDA, A( 1, II ),
- $ LDA, T(1, CTR * M + 1), LDT,
- $ WORK, INFO )
- END IF
+ $ LDA, T(1, CTR * M + 1), LDT,
+ $ WORK, INFO )
+ END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(M * MB)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of SLASWLQ
diff --git a/lapack-netlib/SRC/slatrs3.f b/lapack-netlib/SRC/slatrs3.f
index 8f0c4bf163..17052289ee 100644
--- a/lapack-netlib/SRC/slatrs3.f
+++ b/lapack-netlib/SRC/slatrs3.f
@@ -151,13 +151,16 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is REAL array, dimension (LWORK).
-*> On exit, if INFO = 0, WORK(1) returns the optimal size of
-*> WORK.
+*> WORK is REAL array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
+*> \verbatim
*> LWORK is INTEGER
+*> The dimension of the array WORK.
+*>
+*> If MIN(N,NRHS) = 0, LWORK >= 1, else
*> LWORK >= MAX(1, 2*NBA * MAX(NBA, MIN(NRHS, 32)), where
*> NBA = (N + NB - 1)/NB and NB is the optimal block size.
*>
@@ -165,6 +168,7 @@
*> only calculates the optimal dimensions of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
+*> \endverbatim
*>
*> \param[out] INFO
*> \verbatim
@@ -181,7 +185,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleOTHERauxiliary
+*> \ingroup latrs3
*> \par Further Details:
* =====================
* \verbatim
@@ -253,7 +257,7 @@ SUBROUTINE SLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
LOGICAL LQUERY, NOTRAN, NOUNIT, UPPER
INTEGER AWRK, I, IFIRST, IINC, ILAST, II, I1, I2, J,
$ JFIRST, JINC, JLAST, J1, J2, K, KK, K1, K2,
- $ LANRM, LDS, LSCALE, NB, NBA, NBX, RHS
+ $ LANRM, LDS, LSCALE, NB, NBA, NBX, RHS, LWMIN
REAL ANRM, BIGNUM, BNRM, RSCAL, SCAL, SCALOC,
$ SCAMIN, SMLNUM, TMAX
* ..
@@ -264,7 +268,8 @@ SUBROUTINE SLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
EXTERNAL ILAENV, LSAME, SLAMCH, SLANGE, SLARMM
* ..
* .. External Subroutines ..
- EXTERNAL SLATRS, SSCAL, XERBLA
+ REAL SROUNDUP_LWORK
+ EXTERNAL SLATRS, SSCAL, SROUNDUP_LWORK, XERBLA
* ..
* .. Intrinsic Functions ..
INTRINSIC ABS, MAX, MIN
@@ -292,15 +297,24 @@ SUBROUTINE SLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
* row. WORK( I + KK * LDS ) is the scale factor of the vector
* segment associated with the I-th block row and the KK-th vector
* in the block column.
+*
LSCALE = NBA * MAX( NBA, MIN( NRHS, NBRHS ) )
LDS = NBA
+*
* The second part stores upper bounds of the triangular A. There are
* a total of NBA x NBA blocks, of which only the upper triangular
* part or the lower triangular part is referenced. The upper bound of
* the block A( I, J ) is stored as WORK( AWRK + I + J * NBA ).
+*
LANRM = NBA * NBA
AWRK = LSCALE
- WORK( 1 ) = LSCALE + LANRM
+*
+ IF( MIN( N, NRHS ).EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = LSCALE + LANRM
+ END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
*
* Test the input parameters.
*
@@ -322,7 +336,7 @@ SUBROUTINE SLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
INFO = -8
ELSE IF( LDX.LT.MAX( 1, N ) ) THEN
INFO = -10
- ELSE IF( .NOT.LQUERY .AND. LWORK.LT.WORK( 1 ) ) THEN
+ ELSE IF( .NOT.LQUERY .AND. LWORK.LT.LWMIN ) THEN
INFO = -14
END IF
IF( INFO.NE.0 ) THEN
@@ -650,6 +664,8 @@ SUBROUTINE SLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
END DO
END DO
RETURN
+*
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
*
* End of SLATRS3
*
diff --git a/lapack-netlib/SRC/slatsqr.f b/lapack-netlib/SRC/slatsqr.f
index 86733bb159..4730815b5f 100644
--- a/lapack-netlib/SRC/slatsqr.f
+++ b/lapack-netlib/SRC/slatsqr.f
@@ -101,15 +101,18 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) REAL array, dimension (MAX(1,LWORK))
+*> (workspace) REAL array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= NB*N.
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= NB*N, otherwise.
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
*> \endverbatim
@@ -161,33 +164,39 @@
*> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
*> \endverbatim
*>
+*> \ingroup latsqr
+*>
* =====================================================================
SUBROUTINE SLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
- $ LWORK, INFO)
+ $ LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. --
*
* .. Scalar Arguments ..
- INTEGER INFO, LDA, M, N, MB, NB, LDT, LWORK
+ INTEGER INFO, LDA, M, N, MB, NB, LDT, LWORK
* ..
* .. Array Arguments ..
- REAL A( LDA, * ), WORK( * ), T(LDT, *)
+ REAL A( LDA, * ), WORK( * ), T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LQUERY
- INTEGER I, II, KK, CTR
+ LOGICAL LQUERY
+ INTEGER I, II, KK, CTR, MINMN, LWMIN
* ..
* .. EXTERNAL FUNCTIONS ..
LOGICAL LSAME
EXTERNAL LSAME
+ REAL SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
+* ..
* .. EXTERNAL SUBROUTINES ..
EXTERNAL SGEQRT, STPQRT, XERBLA
+* ..
* .. INTRINSIC FUNCTIONS ..
INTRINSIC MAX, MIN, MOD
* ..
@@ -198,6 +207,13 @@ SUBROUTINE SLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
INFO = 0
*
LQUERY = ( LWORK.EQ.-1 )
+*
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = N*NB
+ END IF
*
IF( M.LT.0 ) THEN
INFO = -1
@@ -205,64 +221,65 @@ SUBROUTINE SLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
INFO = -2
ELSE IF( MB.LT.1 ) THEN
INFO = -3
- ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 )) THEN
+ ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 ) ) THEN
INFO = -4
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -6
ELSE IF( LDT.LT.NB ) THEN
INFO = -8
- ELSE IF( LWORK.LT.(N*NB) .AND. (.NOT.LQUERY) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -10
END IF
- IF( INFO.EQ.0) THEN
- WORK(1) = NB*N
+*
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'SLATSQR', -INFO )
RETURN
- ELSE IF (LQUERY) THEN
- RETURN
+ ELSE IF( LQUERY ) THEN
+ RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N).EQ.0 ) THEN
- RETURN
+ IF( MINMN.EQ.0 ) THEN
+ RETURN
END IF
*
* The QR Decomposition
*
- IF ((MB.LE.N).OR.(MB.GE.M)) THEN
- CALL SGEQRT( M, N, NB, A, LDA, T, LDT, WORK, INFO)
- RETURN
- END IF
- KK = MOD((M-N),(MB-N))
- II=M-KK+1
+ IF( (MB.LE.N) .OR. (MB.GE.M) ) THEN
+ CALL SGEQRT( M, N, NB, A, LDA, T, LDT, WORK, INFO )
+ RETURN
+ END IF
+ KK = MOD((M-N),(MB-N))
+ II = M-KK+1
*
-* Compute the QR factorization of the first block A(1:MB,1:N)
+* Compute the QR factorization of the first block A(1:MB,1:N)
*
- CALL SGEQRT( MB, N, NB, A(1,1), LDA, T, LDT, WORK, INFO )
+ CALL SGEQRT( MB, N, NB, A(1,1), LDA, T, LDT, WORK, INFO )
*
- CTR = 1
- DO I = MB+1, II-MB+N , (MB-N)
+ CTR = 1
+ DO I = MB+1, II-MB+N, (MB-N)
*
-* Compute the QR factorization of the current block A(I:I+MB-N,1:N)
+* Compute the QR factorization of the current block A(I:I+MB-N,1:N)
*
- CALL STPQRT( MB-N, N, 0, NB, A(1,1), LDA, A( I, 1 ), LDA,
- $ T(1, CTR * N + 1),
- $ LDT, WORK, INFO )
- CTR = CTR + 1
- END DO
+ CALL STPQRT( MB-N, N, 0, NB, A(1,1), LDA, A( I, 1 ), LDA,
+ $ T(1, CTR * N + 1),
+ $ LDT, WORK, INFO )
+ CTR = CTR + 1
+ END DO
*
-* Compute the QR factorization of the last block A(II:M,1:N)
+* Compute the QR factorization of the last block A(II:M,1:N)
*
- IF (II.LE.M) THEN
- CALL STPQRT( KK, N, 0, NB, A(1,1), LDA, A( II, 1 ), LDA,
- $ T(1, CTR * N + 1), LDT,
- $ WORK, INFO )
- END IF
+ IF( II.LE.M ) THEN
+ CALL STPQRT( KK, N, 0, NB, A(1,1), LDA, A( II, 1 ), LDA,
+ $ T(1, CTR * N + 1), LDT,
+ $ WORK, INFO )
+ END IF
*
- work( 1 ) = N*NB
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of SLATSQR
diff --git a/lapack-netlib/SRC/ssyevd.f b/lapack-netlib/SRC/ssyevd.f
index a5e4638d6f..2ae44fc813 100644
--- a/lapack-netlib/SRC/ssyevd.f
+++ b/lapack-netlib/SRC/ssyevd.f
@@ -96,8 +96,7 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is REAL array,
-*> dimension (LWORK)
+*> WORK is REAL array, dimension (MAX(1,LWORK))
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
@@ -251,7 +250,7 @@ SUBROUTINE SSYEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK,
$ N*ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 ) )
LIOPT = LIWMIN
END IF
- WORK( 1 ) = SROUNDUP_LWORK(LOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LOPT )
IWORK( 1 ) = LIOPT
*
IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
@@ -335,7 +334,7 @@ SUBROUTINE SSYEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK,
IF( ISCALE.EQ.1 )
$ CALL SSCAL( N, ONE / SIGMA, W, 1 )
*
- WORK( 1 ) = SROUNDUP_LWORK(LOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LOPT )
IWORK( 1 ) = LIOPT
*
RETURN
diff --git a/lapack-netlib/SRC/ssyevr.f b/lapack-netlib/SRC/ssyevr.f
index 47e4d7cbf3..870facd606 100644
--- a/lapack-netlib/SRC/ssyevr.f
+++ b/lapack-netlib/SRC/ssyevr.f
@@ -271,7 +271,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,26*N).
+*> The dimension of the array WORK.
+*> If N <= 1, LWORK >= 1, else LWORK >= 26*N.
*> For optimal efficiency, LWORK >= (NB+6)*N,
*> where NB is the max of the blocksize for SSYTRD and SORMTR
*> returned by ILAENV.
@@ -292,7 +293,8 @@
*> \param[in] LIWORK
*> \verbatim
*> LIWORK is INTEGER
-*> The dimension of the array IWORK. LIWORK >= max(1,10*N).
+*> The dimension of the array IWORK.
+*> If N <= 1, LIWORK >= 1, else LIWORK >= 10*N.
*>
*> If LIWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal sizes of the WORK and
@@ -392,8 +394,13 @@ SUBROUTINE SSYEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
*
LQUERY = ( ( LWORK.EQ.-1 ) .OR. ( LIWORK.EQ.-1 ) )
*
- LWMIN = MAX( 1, 26*N )
- LIWMIN = MAX( 1, 10*N )
+ IF( N.LE.1 ) THEN
+ LWMIN = 1
+ LIWMIN = 1
+ ELSE
+ LWMIN = 26*N
+ LIWMIN = 10*N
+ END IF
*
INFO = 0
IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
@@ -428,7 +435,7 @@ SUBROUTINE SSYEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
NB = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 )
NB = MAX( NB, ILAENV( 1, 'SORMTR', UPLO, N, -1, -1, -1 ) )
LWKOPT = MAX( ( NB+1 )*N, LWMIN )
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
IWORK( 1 ) = LIWMIN
*
IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
@@ -677,7 +684,7 @@ SUBROUTINE SSYEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
*
* Set WORK(1) to optimal workspace size.
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
IWORK( 1 ) = LIWMIN
*
RETURN
diff --git a/lapack-netlib/SRC/ssyevr_2stage.f b/lapack-netlib/SRC/ssyevr_2stage.f
index a2d6a62317..471e259776 100644
--- a/lapack-netlib/SRC/ssyevr_2stage.f
+++ b/lapack-netlib/SRC/ssyevr_2stage.f
@@ -278,6 +278,7 @@
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
+*> If N <= 1, LWORK must be at least 1.
*> If JOBZ = 'N' and N > 1, LWORK must be queried.
*> LWORK = MAX(1, 26*N, dimension) where
*> dimension = max(stage1,stage2) + (KD+1)*N + 5*N
@@ -300,13 +301,14 @@
*> \param[out] IWORK
*> \verbatim
*> IWORK is INTEGER array, dimension (MAX(1,LIWORK))
-*> On exit, if INFO = 0, IWORK(1) returns the optimal LWORK.
+*> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
*> \endverbatim
*>
*> \param[in] LIWORK
*> \verbatim
*> LIWORK is INTEGER
-*> The dimension of the array IWORK. LIWORK >= max(1,10*N).
+*> The dimension of the array IWORK.
+*> If N <= 1, LIWORK >= 1, else LIWORK >= 10*N.
*>
*> If LIWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal size of the IWORK array,
@@ -445,8 +447,14 @@ SUBROUTINE SSYEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
IB = ILAENV2STAGE( 2, 'SSYTRD_2STAGE', JOBZ, N, KD, -1, -1 )
LHTRD = ILAENV2STAGE( 3, 'SSYTRD_2STAGE', JOBZ, N, KD, IB, -1 )
LWTRD = ILAENV2STAGE( 4, 'SSYTRD_2STAGE', JOBZ, N, KD, IB, -1 )
- LWMIN = MAX( 26*N, 5*N + LHTRD + LWTRD )
- LIWMIN = MAX( 1, 10*N )
+*
+ IF( N.LE.1 ) THEN
+ LWMIN = 1
+ LIWMIN = 1
+ ELSE
+ LWMIN = MAX( 26*N, 5*N + LHTRD + LWTRD )
+ LIWMIN = 10*N
+ END IF
*
INFO = 0
IF( .NOT.( LSAME( JOBZ, 'N' ) ) ) THEN
@@ -485,7 +493,7 @@ SUBROUTINE SSYEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
* NB = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 )
* NB = MAX( NB, ILAENV( 1, 'SORMTR', UPLO, N, -1, -1, -1 ) )
* LWKOPT = MAX( ( NB+1 )*N, LWMIN )
- WORK( 1 ) = SROUNDUP_LWORK(LWMIN)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
IWORK( 1 ) = LIWMIN
END IF
*
@@ -505,7 +513,7 @@ SUBROUTINE SSYEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
END IF
*
IF( N.EQ.1 ) THEN
- WORK( 1 ) = 26
+ WORK( 1 ) = 1
IF( ALLEIG .OR. INDEIG ) THEN
M = 1
W( 1 ) = A( 1, 1 )
@@ -733,7 +741,7 @@ SUBROUTINE SSYEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
*
* Set WORK(1) to optimal workspace size.
*
- WORK( 1 ) = SROUNDUP_LWORK(LWMIN)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
IWORK( 1 ) = LIWMIN
*
RETURN
diff --git a/lapack-netlib/SRC/ssyevx.f b/lapack-netlib/SRC/ssyevx.f
index 2204aa39bc..aaed6dad57 100644
--- a/lapack-netlib/SRC/ssyevx.f
+++ b/lapack-netlib/SRC/ssyevx.f
@@ -338,14 +338,14 @@ SUBROUTINE SSYEVX( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
IF( INFO.EQ.0 ) THEN
IF( N.LE.1 ) THEN
LWKMIN = 1
- WORK( 1 ) = SROUNDUP_LWORK(LWKMIN)
+ LWKOPT = 1
ELSE
LWKMIN = 8*N
NB = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 )
NB = MAX( NB, ILAENV( 1, 'SORMTR', UPLO, N, -1, -1, -1 ) )
LWKOPT = MAX( LWKMIN, ( NB + 3 )*N )
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY )
$ INFO = -17
@@ -542,7 +542,7 @@ SUBROUTINE SSYEVX( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
*
* Set WORK(1) to optimal workspace size.
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/ssysv_aa.f b/lapack-netlib/SRC/ssysv_aa.f
index e43d4de7f4..711a275e13 100644
--- a/lapack-netlib/SRC/ssysv_aa.f
+++ b/lapack-netlib/SRC/ssysv_aa.f
@@ -177,12 +177,13 @@ SUBROUTINE SSYSV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
*
* .. Local Scalars ..
LOGICAL LQUERY
- INTEGER LWKOPT, LWKOPT_SYTRF, LWKOPT_SYTRS
+ INTEGER LWKMIN, LWKOPT, LWKOPT_SYTRF, LWKOPT_SYTRS
* ..
* .. External Functions ..
LOGICAL LSAME
+ EXTERNAL LSAME
REAL SROUNDUP_LWORK
- EXTERNAL LSAME, SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL XERBLA, SSYTRS_AA, SSYTRF_AA
@@ -196,6 +197,7 @@ SUBROUTINE SSYSV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
*
INFO = 0
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 2*N, 3*N-2 )
IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -206,18 +208,18 @@ SUBROUTINE SSYSV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
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
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -10
END IF
*
IF( INFO.EQ.0 ) THEN
CALL SSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, -1, INFO )
- LWKOPT_SYTRF = INT( WORK(1) )
+ LWKOPT_SYTRF = INT( WORK( 1 ) )
CALL SSYTRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
$ -1, INFO )
- LWKOPT_SYTRS = INT( WORK(1) )
- LWKOPT = MAX( LWKOPT_SYTRF, LWKOPT_SYTRS )
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ LWKOPT_SYTRS = INT( WORK( 1 ) )
+ LWKOPT = MAX( LWKMIN, LWKOPT_SYTRF, LWKOPT_SYTRS )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -239,7 +241,7 @@ SUBROUTINE SSYSV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
*
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/ssysv_aa_2stage.f b/lapack-netlib/SRC/ssysv_aa_2stage.f
index 3d88e068e6..fb068b3bf7 100644
--- a/lapack-netlib/SRC/ssysv_aa_2stage.f
+++ b/lapack-netlib/SRC/ssysv_aa_2stage.f
@@ -100,14 +100,14 @@
*>
*> \param[out] TB
*> \verbatim
-*> TB is REAL array, dimension (LTB)
+*> TB is REAL array, dimension (MAX(1,LTB))
*> On exit, details of the LU factorization of the band matrix.
*> \endverbatim
*>
*> \param[in] LTB
*> \verbatim
*> LTB is INTEGER
-*> The size of the array TB. LTB >= 4*N, internally
+*> The size of the array TB. LTB >= MAX(1,4*N), internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*> If LTB = -1, then a workspace query is assumed; the
@@ -147,14 +147,15 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is REAL workspace of size LWORK
+*> WORK is REAL workspace of size (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The size of WORK. LWORK >= N, internally used to select NB
-*> such that LWORK >= N*NB.
+*> The size of WORK. LWORK >= MAX(1,N), internally used to
+*> select NB such that LWORK >= N*NB.
*>
*> If LWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal size of the WORK array,
@@ -204,12 +205,13 @@ SUBROUTINE SSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
* ..
* .. Local Scalars ..
LOGICAL UPPER, TQUERY, WQUERY
- INTEGER LWKOPT
+ INTEGER LWKMIN, LWKOPT
* ..
* .. External Functions ..
LOGICAL LSAME
+ EXTERNAL LSAME
REAL SROUNDUP_LWORK
- EXTERNAL LSAME, SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL SSYTRF_AA_2STAGE, SSYTRS_AA_2STAGE,
@@ -226,6 +228,7 @@ SUBROUTINE SSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
UPPER = LSAME( UPLO, 'U' )
WQUERY = ( LWORK.EQ.-1 )
TQUERY = ( LTB.EQ.-1 )
+ LWKMIN = MAX( 1, N )
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -234,18 +237,19 @@ SUBROUTINE SSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
INFO = -3
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -5
- ELSE IF( LTB.LT.( 4*N ) .AND. .NOT.TQUERY ) THEN
+ ELSE IF( LTB.LT.MAX( 1, 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
+ ELSE IF( LWORK.LT.LWKMIN .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) )
+ LWKOPT = MAX( LWKMIN, INT( WORK( 1 ) ) )
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -255,7 +259,6 @@ SUBROUTINE SSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
RETURN
END IF
*
-*
* Compute the factorization A = U**T*T*U or A = L*T*L**T.
*
CALL SSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV, IPIV2,
@@ -269,7 +272,7 @@ SUBROUTINE SSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
*
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/ssysvx.f b/lapack-netlib/SRC/ssysvx.f
index 0d72217eb3..06a6413f19 100644
--- a/lapack-netlib/SRC/ssysvx.f
+++ b/lapack-netlib/SRC/ssysvx.f
@@ -305,7 +305,7 @@ SUBROUTINE SSYSVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, NOFACT
- INTEGER LWKOPT, NB
+ INTEGER LWKMIN, LWKOPT, NB
REAL ANORM
* ..
* .. External Functions ..
@@ -327,6 +327,7 @@ SUBROUTINE SSYSVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
INFO = 0
NOFACT = LSAME( FACT, 'N' )
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 3*N )
IF( .NOT.NOFACT .AND. .NOT.LSAME( FACT, 'F' ) ) THEN
INFO = -1
ELSE IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) )
@@ -344,12 +345,12 @@ SUBROUTINE SSYSVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
INFO = -11
ELSE IF( LDX.LT.MAX( 1, N ) ) THEN
INFO = -13
- ELSE IF( LWORK.LT.MAX( 1, 3*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -18
END IF
*
IF( INFO.EQ.0 ) THEN
- LWKOPT = MAX( 1, 3*N )
+ LWKOPT = LWKMIN
IF( NOFACT ) THEN
NB = ILAENV( 1, 'SSYTRF', UPLO, N, -1, -1, -1 )
LWKOPT = MAX( LWKOPT, N*NB )
diff --git a/lapack-netlib/SRC/ssytrd_2stage.f b/lapack-netlib/SRC/ssytrd_2stage.f
index 5d70ae0d4a..5b401c3d04 100644
--- a/lapack-netlib/SRC/ssytrd_2stage.f
+++ b/lapack-netlib/SRC/ssytrd_2stage.f
@@ -4,23 +4,23 @@
*
* =========== DOCUMENTATION ===========
*
-* Online html documentation available at
-* http://www.netlib.org/lapack/explore-html/
+* Online html documentation available at
+* http://www.netlib.org/lapack/explore-html/
*
*> \htmlonly
-*> Download SSYTRD_2STAGE + dependencies
-*>
-*> [TGZ]
-*>
-*> [ZIP]
-*>
+*> Download SSYTRD_2STAGE + dependencies
+*>
+*> [TGZ]
+*>
+*> [ZIP]
+*>
*> [TXT]
-*> \endhtmlonly
+*> \endhtmlonly
*
* Definition:
* ===========
*
-* SUBROUTINE SSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
+* SUBROUTINE SSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
* HOUS2, LHOUS2, WORK, LWORK, INFO )
*
* IMPLICIT NONE
@@ -34,7 +34,7 @@
* REAL A( LDA, * ), TAU( * ),
* HOUS2( * ), WORK( * )
* ..
-*
+*
*
*> \par Purpose:
* =============
@@ -52,11 +52,11 @@
*> \param[in] VECT
*> \verbatim
*> VECT is CHARACTER*1
-*> = 'N': No need for the Housholder representation,
+*> = 'N': No need for the Housholder representation,
*> in particular for the second stage (Band to
*> tridiagonal) and thus LHOUS2 is of size max(1, 4*N);
-*> = 'V': the Householder representation is needed to
-*> either generate Q1 Q2 or to apply Q1 Q2,
+*> = 'V': the Householder representation is needed to
+*> either generate Q1 Q2 or to apply Q1 Q2,
*> then LHOUS2 is to be queried and computed.
*> (NOT AVAILABLE IN THIS RELEASE).
*> \endverbatim
@@ -86,7 +86,7 @@
*> triangular part of A is not referenced.
*> On exit, if UPLO = 'U', the band superdiagonal
*> of A are overwritten by the corresponding elements of the
-*> internal band-diagonal matrix AB, and the elements above
+*> internal band-diagonal matrix AB, and the elements above
*> the KD superdiagonal, with the array TAU, represent the orthogonal
*> matrix Q1 as a product of elementary reflectors; if UPLO
*> = 'L', the diagonal and band subdiagonal of A are over-
@@ -117,13 +117,13 @@
*> \param[out] TAU
*> \verbatim
*> TAU is REAL array, dimension (N-KD)
-*> The scalar factors of the elementary reflectors of
+*> The scalar factors of the elementary reflectors of
*> the first stage (see Further Details).
*> \endverbatim
*>
*> \param[out] HOUS2
*> \verbatim
-*> HOUS2 is REAL array, dimension (LHOUS2)
+*> HOUS2 is REAL array, dimension (MAX(1,LHOUS2))
*> Stores the Householder representation of the stage2
*> band to tridiagonal.
*> \endverbatim
@@ -132,6 +132,8 @@
*> \verbatim
*> LHOUS2 is INTEGER
*> The dimension of the array HOUS2.
+*> LHOUS2 >= 1.
+*>
*> If LWORK = -1, or LHOUS2 = -1,
*> then a query is assumed; the routine
*> only calculates the optimal size of the HOUS2 array, returns
@@ -149,17 +151,19 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK = MAX(1, dimension)
-*> If LWORK = -1, or LHOUS2=-1,
+*> The dimension of the array WORK.
+*> If N = 0, LWORK >= 1, else LWORK = MAX(1, dimension).
+*>
+*> If LWORK = -1, or LHOUS2 = -1,
*> then a workspace query is assumed; the routine
*> only 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 LWORK is issued by XERBLA.
*> LWORK = MAX(1, dimension) where
*> dimension = max(stage1,stage2) + (KD+1)*N
-*> = N*KD + N*max(KD+1,FACTOPTNB)
-*> + max(2*KD*KD, KD*NTHREADS)
-*> + (KD+1)*N
+*> = N*KD + N*max(KD+1,FACTOPTNB)
+*> + max(2*KD*KD, KD*NTHREADS)
+*> + (KD+1)*N
*> where KD is the blocking size of the reduction,
*> FACTOPTNB is the blocking used by the QR or LQ
*> algorithm, usually FACTOPTNB=128 is a good choice
@@ -177,12 +181,12 @@
* Authors:
* ========
*
-*> \author Univ. of Tennessee
-*> \author Univ. of California Berkeley
-*> \author Univ. of Colorado Denver
-*> \author NAG Ltd.
+*> \author Univ. of Tennessee
+*> \author Univ. of California Berkeley
+*> \author Univ. of Colorado Denver
+*> \author NAG Ltd.
*
-*> \ingroup realSYcomputational
+*> \ingroup hetrd_2stage
*
*> \par Further Details:
* =====================
@@ -202,7 +206,7 @@
*> http://doi.acm.org/10.1145/2063384.2063394
*>
*> A. Haidar, J. Kurzak, P. Luszczek, 2013.
-*> An improved parallel singular value algorithm and its implementation
+*> An improved parallel singular value algorithm and its implementation
*> for multicore hardware, In Proceedings of 2013 International Conference
*> for High Performance Computing, Networking, Storage and Analysis (SC '13).
*> Denver, Colorado, USA, 2013.
@@ -210,16 +214,16 @@
*> http://doi.acm.org/10.1145/2503210.2503292
*>
*> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
-*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
+*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
*> calculations based on fine-grained memory aware tasks.
*> International Journal of High Performance Computing Applications.
*> Volume 28 Issue 2, Pages 196-209, May 2014.
-*> http://hpc.sagepub.com/content/28/2/196
+*> http://hpc.sagepub.com/content/28/2/196
*>
*> \endverbatim
*>
* =====================================================================
- SUBROUTINE SSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
+ SUBROUTINE SSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
$ HOUS2, LHOUS2, WORK, LWORK, INFO )
*
IMPLICIT NONE
@@ -265,10 +269,13 @@ SUBROUTINE SSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
*
KD = ILAENV2STAGE( 1, 'SSYTRD_2STAGE', VECT, N, -1, -1, -1 )
IB = ILAENV2STAGE( 2, 'SSYTRD_2STAGE', VECT, N, KD, -1, -1 )
- LHMIN = ILAENV2STAGE( 3, 'SSYTRD_2STAGE', VECT, N, KD, IB, -1 )
- LWMIN = ILAENV2STAGE( 4, 'SSYTRD_2STAGE', VECT, N, KD, IB, -1 )
-* WRITE(*,*),'SSYTRD_2STAGE N KD UPLO LHMIN LWMIN ',N, KD, UPLO,
-* $ LHMIN, LWMIN
+ IF( N.EQ.0 ) THEN
+ LHMIN = 1
+ LWMIN = 1
+ ELSE
+ LHMIN = ILAENV2STAGE( 3, 'SSYTRD_2STAGE', VECT, N, KD, IB, -1 )
+ LWMIN = ILAENV2STAGE( 4, 'SSYTRD_2STAGE', VECT, N, KD, IB, -1 )
+ END IF
*
IF( .NOT.LSAME( VECT, 'N' ) ) THEN
INFO = -1
@@ -309,14 +316,14 @@ SUBROUTINE SSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
LWRK = LWORK-LDAB*N
ABPOS = 1
WPOS = ABPOS + LDAB*N
- CALL SSYTRD_SY2SB( UPLO, N, KD, A, LDA, WORK( ABPOS ), LDAB,
+ CALL SSYTRD_SY2SB( UPLO, N, KD, A, LDA, WORK( ABPOS ), LDAB,
$ TAU, WORK( WPOS ), LWRK, INFO )
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'SSYTRD_SY2SB', -INFO )
RETURN
END IF
- CALL SSYTRD_SB2ST( 'Y', VECT, UPLO, N, KD,
- $ WORK( ABPOS ), LDAB, D, E,
+ CALL SSYTRD_SB2ST( 'Y', VECT, UPLO, N, KD,
+ $ WORK( ABPOS ), LDAB, D, E,
$ HOUS2, LHOUS2, WORK( WPOS ), LWRK, INFO )
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'SSYTRD_SB2ST', -INFO )
@@ -324,8 +331,7 @@ SUBROUTINE SSYTRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
END IF
*
*
- HOUS2( 1 ) = LHMIN
- WORK( 1 ) = LWMIN
+ WORK( 1 ) = LWMIN
RETURN
*
* End of SSYTRD_2STAGE
diff --git a/lapack-netlib/SRC/ssytrd_sb2st.F b/lapack-netlib/SRC/ssytrd_sb2st.F
index 32bae26dc0..111eaa93ec 100644
--- a/lapack-netlib/SRC/ssytrd_sb2st.F
+++ b/lapack-netlib/SRC/ssytrd_sb2st.F
@@ -132,15 +132,17 @@
*>
*> \param[out] HOUS
*> \verbatim
-*> HOUS is REAL array, dimension LHOUS, that
-*> store the Householder representation.
+*> HOUS is REAL array, dimension (MAX(1,LHOUS))
+*> Stores the Householder representation.
*> \endverbatim
*>
*> \param[in] LHOUS
*> \verbatim
*> LHOUS is INTEGER
-*> The dimension of the array HOUS. LHOUS = MAX(1, dimension)
-*> If LWORK = -1, or LHOUS=-1,
+*> The dimension of the array HOUS.
+*> If N = 0 or KD <= 1, LHOUS >= 1, else LHOUS = MAX(1, dimension)
+*>
+*> If LWORK = -1, or LHOUS = -1,
*> then a query is assumed; the routine
*> only calculates the optimal size of the HOUS array, returns
*> this value as the first entry of the HOUS array, and no error
@@ -152,14 +154,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is REAL array, dimension LWORK.
+*> WORK is REAL array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK = MAX(1, dimension)
-*> If LWORK = -1, or LHOUS=-1,
+*> The dimension of the array WORK.
+*> IF N = 0 or KD <= 1, LWORK >= 1, else LWORK = MAX(1, dimension)
+*>
+*> If LWORK = -1, or LHOUS = -1,
*> then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
@@ -261,7 +266,7 @@ SUBROUTINE SSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
INTEGER I, M, K, IB, SWEEPID, MYID, SHIFT, STT, ST,
$ ED, STIND, EDIND, BLKLASTIND, COLPT, THED,
$ STEPERCOL, GRSIZ, THGRSIZ, THGRNB, THGRID,
- $ NBTILES, TTYPE, TID, NTHREADS, DEBUG,
+ $ NBTILES, TTYPE, TID, NTHREADS,
$ ABDPOS, ABOFDPOS, DPOS, OFDPOS, AWPOS,
$ INDA, INDW, APOS, SIZEA, LDA, INDV, INDTAU,
$ SISEV, SIZETAU, LDV, LHMIN, LWMIN
@@ -283,7 +288,6 @@ SUBROUTINE SSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
* Determine the minimal workspace size required.
* Test the input parameters
*
- DEBUG = 0
INFO = 0
AFTERS1 = LSAME( STAGE1, 'Y' )
WANTQ = LSAME( VECT, 'V' )
@@ -292,9 +296,14 @@ SUBROUTINE SSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
*
* Determine the block size, the workspace size and the hous size.
*
- IB = ILAENV2STAGE( 2, 'SSYTRD_SB2ST', VECT, N, KD, -1, -1 )
- LHMIN = ILAENV2STAGE( 3, 'SSYTRD_SB2ST', VECT, N, KD, IB, -1 )
- LWMIN = ILAENV2STAGE( 4, 'SSYTRD_SB2ST', VECT, N, KD, IB, -1 )
+ IB = ILAENV2STAGE( 2, 'SSYTRD_SB2ST', VECT, N, KD, -1, -1 )
+ IF( N.EQ.0 .OR. KD.LE.1 ) THEN
+ LHMIN = 1
+ LWMIN = 1
+ ELSE
+ LHMIN = ILAENV2STAGE( 3, 'SSYTRD_SB2ST', VECT, N, KD, IB, -1 )
+ LWMIN = ILAENV2STAGE( 4, 'SSYTRD_SB2ST', VECT, N, KD, IB, -1 )
+ END IF
*
IF( .NOT.AFTERS1 .AND. .NOT.LSAME( STAGE1, 'N' ) ) THEN
INFO = -1
@@ -315,8 +324,8 @@ SUBROUTINE SSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
END IF
*
IF( INFO.EQ.0 ) THEN
- HOUS( 1 ) = LHMIN
- WORK( 1 ) = SROUNDUP_LWORK(LWMIN)
+ HOUS( 1 ) = SROUNDUP_LWORK( LHMIN )
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -544,8 +553,7 @@ SUBROUTINE SSYTRD_SB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
170 CONTINUE
ENDIF
*
- HOUS( 1 ) = LHMIN
- WORK( 1 ) = SROUNDUP_LWORK(LWMIN)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of SSYTRD_SB2ST
diff --git a/lapack-netlib/SRC/ssytrd_sy2sb.f b/lapack-netlib/SRC/ssytrd_sy2sb.f
index 4efc436302..3996e07bba 100644
--- a/lapack-netlib/SRC/ssytrd_sy2sb.f
+++ b/lapack-netlib/SRC/ssytrd_sy2sb.f
@@ -124,7 +124,7 @@
*> \param[out] WORK
*> \verbatim
*> WORK is REAL array, dimension (LWORK)
-*> On exit, if INFO = 0, or if LWORK=-1,
+*> On exit, if INFO = 0, or if LWORK = -1,
*> WORK(1) returns the size of LWORK.
*> \endverbatim
*>
@@ -132,7 +132,9 @@
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK which should be calculated
-*> by a workspace query. LWORK = MAX(1, LWORK_QUERY)
+*> by a workspace query.
+*> If N <= KD+1, LWORK >= 1, else LWORK = MAX(1, LWORK_QUERY)
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
@@ -294,8 +296,12 @@ SUBROUTINE SSYTRD_SY2SB( UPLO, N, KD, A, LDA, AB, LDAB, TAU,
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
- LWMIN = ILAENV2STAGE( 4, 'SSYTRD_SY2SB', '', N, KD, -1, -1 )
-
+ IF( N.LE.KD+1 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = ILAENV2STAGE( 4, 'SSYTRD_SY2SB', '', N, KD, -1, -1 )
+ END IF
+*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -314,7 +320,7 @@ SUBROUTINE SSYTRD_SY2SB( UPLO, N, KD, A, LDA, AB, LDAB, TAU,
CALL XERBLA( 'SSYTRD_SY2SB', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- WORK( 1 ) = SROUNDUP_LWORK(LWMIN)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
END IF
*
@@ -507,7 +513,7 @@ SUBROUTINE SSYTRD_SY2SB( UPLO, N, KD, A, LDA, AB, LDAB, TAU,
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(LWMIN)
+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
RETURN
*
* End of SSYTRD_SY2SB
diff --git a/lapack-netlib/SRC/ssytrf.f b/lapack-netlib/SRC/ssytrf.f
index a788fbcf07..55f3a4f0fe 100644
--- a/lapack-netlib/SRC/ssytrf.f
+++ b/lapack-netlib/SRC/ssytrf.f
@@ -234,7 +234,7 @@ SUBROUTINE SSYTRF( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
*
NB = ILAENV( 1, 'SSYTRF', UPLO, N, -1, -1, -1 )
LWKOPT = MAX( 1, N*NB )
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -353,7 +353,8 @@ SUBROUTINE SSYTRF( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
END IF
*
40 CONTINUE
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+*
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
*
* End of SSYTRF
diff --git a/lapack-netlib/SRC/ssytrf_aa.f b/lapack-netlib/SRC/ssytrf_aa.f
index d6408a9788..af32fb064a 100644
--- a/lapack-netlib/SRC/ssytrf_aa.f
+++ b/lapack-netlib/SRC/ssytrf_aa.f
@@ -101,8 +101,10 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >= MAX(1,2*N). For optimum performance
-*> LWORK >= N*(1+NB), where NB is the optimal blocksize.
+*> The length of WORK.
+*> LWORK >= 1, if N <= 1, and LWORK >= 2*N, otherwise.
+*> For optimum performance LWORK >= N*(1+NB), where NB is
+*> the optimal blocksize, returned by ILAENV.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -128,7 +130,7 @@
*> \ingroup hetrf_aa
*
* =====================================================================
- SUBROUTINE SSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
+ SUBROUTINE SSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
@@ -142,19 +144,19 @@ SUBROUTINE SSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
* ..
* .. Array Arguments ..
INTEGER IPIV( * )
- REAL A( LDA, * ), WORK( * )
+ REAL A( LDA, * ), WORK( * )
* ..
*
* =====================================================================
* .. Parameters ..
- REAL ZERO, ONE
+ REAL ZERO, ONE
PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 )
*
* .. Local Scalars ..
LOGICAL LQUERY, UPPER
- INTEGER J, LWKOPT
+ INTEGER J, LWKMIN, LWKOPT
INTEGER NB, MJ, NJ, K1, K2, J1, J2, J3, JB
- REAL ALPHA
+ REAL ALPHA
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -180,19 +182,26 @@ SUBROUTINE SSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
+ IF( N.LE.1 ) THEN
+ LWKMIN = 1
+ LWKOPT = 1
+ ELSE
+ LWKMIN = 2*N
+ LWKOPT = (NB+1)*N
+ END IF
+*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, 2*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -7
END IF
*
IF( INFO.EQ.0 ) THEN
- LWKOPT = (NB+1)*N
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -204,11 +213,11 @@ SUBROUTINE SSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
*
* Quick return
*
- IF ( N.EQ.0 ) THEN
+ IF( N.EQ.0 ) THEN
RETURN
ENDIF
IPIV( 1 ) = 1
- IF ( N.EQ.1 ) THEN
+ IF( N.EQ.1 ) THEN
RETURN
END IF
*
@@ -458,7 +467,8 @@ SUBROUTINE SSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
END IF
*
20 CONTINUE
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+*
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
*
* End of SSYTRF_AA
diff --git a/lapack-netlib/SRC/ssytrf_aa_2stage.f b/lapack-netlib/SRC/ssytrf_aa_2stage.f
index abe6564c5d..6b5cdee1bc 100644
--- a/lapack-netlib/SRC/ssytrf_aa_2stage.f
+++ b/lapack-netlib/SRC/ssytrf_aa_2stage.f
@@ -94,7 +94,7 @@
*> \param[in] LTB
*> \verbatim
*> LTB is INTEGER
-*> The size of the array TB. LTB >= 4*N, internally
+*> The size of the array TB. LTB >= MAX(1,4*N), internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*> If LTB = -1, then a workspace query is assumed; the
@@ -121,14 +121,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is REAL workspace of size LWORK
+*> WORK is REAL workspace of size (MAX(1,LWORK))
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The size of WORK. LWORK >= N, internally used to select NB
-*> such that LWORK >= N*NB.
+*> The size of WORK. LWORK >= MAX(1,N), internally used to
+*> select NB such that LWORK >= N*NB.
*>
*> If LWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal size of the WORK array,
@@ -212,9 +212,9 @@ SUBROUTINE SSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF ( LTB .LT. 4*N .AND. .NOT.TQUERY ) THEN
+ ELSE IF( LTB.LT.MAX( 1, 4*N ) .AND. .NOT.TQUERY ) THEN
INFO = -6
- ELSE IF ( LWORK .LT. N .AND. .NOT.WQUERY ) THEN
+ ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.WQUERY ) THEN
INFO = -10
END IF
*
@@ -228,10 +228,10 @@ SUBROUTINE SSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
NB = ILAENV( 1, 'SSYTRF_AA_2STAGE', UPLO, N, -1, -1, -1 )
IF( INFO.EQ.0 ) THEN
IF( TQUERY ) THEN
- TB( 1 ) = (3*NB+1)*N
+ TB( 1 ) = SROUNDUP_LWORK( MAX( 1, (3*NB+1)*N ) )
END IF
IF( WQUERY ) THEN
- WORK( 1 ) = SROUNDUP_LWORK(N*NB)
+ WORK( 1 ) = SROUNDUP_LWORK( MAX( 1, N*NB ) )
END IF
END IF
IF( TQUERY .OR. WQUERY ) THEN
@@ -240,7 +240,7 @@ SUBROUTINE SSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
*
* Quick return
*
- IF ( N.EQ.0 ) THEN
+ IF( N.EQ.0 ) THEN
RETURN
ENDIF
*
diff --git a/lapack-netlib/SRC/ssytrf_rk.f b/lapack-netlib/SRC/ssytrf_rk.f
index 72830543cf..89ecf38fde 100644
--- a/lapack-netlib/SRC/ssytrf_rk.f
+++ b/lapack-netlib/SRC/ssytrf_rk.f
@@ -177,14 +177,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is REAL array, dimension ( MAX(1,LWORK) ).
+*> WORK is REAL array, dimension (MAX(1,LWORK)).
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >=1. For best performance
+*> The length of WORK. LWORK >= 1. For best performance
*> LWORK >= N*NB, where NB is the block size returned
*> by ILAENV.
*>
@@ -312,7 +312,7 @@ SUBROUTINE SSYTRF_RK( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
*
NB = ILAENV( 1, 'SSYTRF_RK', UPLO, N, -1, -1, -1 )
LWKOPT = MAX( 1, N*NB )
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -488,7 +488,7 @@ SUBROUTINE SSYTRF_RK( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
*
END IF
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
*
* End of SSYTRF_RK
diff --git a/lapack-netlib/SRC/ssytrf_rook.f b/lapack-netlib/SRC/ssytrf_rook.f
index 339a229e7c..7c2cbbc57e 100644
--- a/lapack-netlib/SRC/ssytrf_rook.f
+++ b/lapack-netlib/SRC/ssytrf_rook.f
@@ -118,7 +118,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >=1. For best performance
+*> The length of WORK. LWORK >= 1. For best performance
*> LWORK >= N*NB, where NB is the block size returned by ILAENV.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
@@ -260,7 +260,7 @@ SUBROUTINE SSYTRF_ROOK( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
*
NB = ILAENV( 1, 'SSYTRF_ROOK', UPLO, N, -1, -1, -1 )
LWKOPT = MAX( 1, N*NB )
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -383,7 +383,8 @@ SUBROUTINE SSYTRF_ROOK( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
END IF
*
40 CONTINUE
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+*
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
RETURN
*
* End of SSYTRF_ROOK
diff --git a/lapack-netlib/SRC/ssytri2.f b/lapack-netlib/SRC/ssytri2.f
index 49f6cad652..fd1c53473d 100644
--- a/lapack-netlib/SRC/ssytri2.f
+++ b/lapack-netlib/SRC/ssytri2.f
@@ -88,16 +88,16 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is REAL array, dimension (N+NB+1)*(NB+3)
+*> WORK is REAL array, dimension (MAX(1,LWORK))
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*> WORK is size >= (N+NB+1)*(NB+3)
+*> If N = 0, LWORK >= 1, else LWORK >= (N+NB+1)*(NB+3).
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> calculates:
+*> 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 LWORK is issued by XERBLA.
@@ -120,7 +120,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup realSYcomputational
+*> \ingroup hetri2
*
* =====================================================================
SUBROUTINE SSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
@@ -147,7 +147,8 @@ SUBROUTINE SSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
* .. External Functions ..
LOGICAL LSAME
INTEGER ILAENV
- EXTERNAL LSAME, ILAENV
+ REAL SROUNDUP_LWORK
+ EXTERNAL LSAME, ILAENV, SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL SSYTRI, SSYTRI2X, XERBLA
@@ -159,9 +160,13 @@ SUBROUTINE SSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
+*
* Get blocksize
+*
NBMAX = ILAENV( 1, 'SSYTRF', UPLO, N, -1, -1, -1 )
- IF ( NBMAX .GE. N ) THEN
+ IF( N.EQ.0 ) THEN
+ MINSIZE = 1
+ ELSE IF( NBMAX.GE.N ) THEN
MINSIZE = N
ELSE
MINSIZE = (N+NBMAX+1)*(NBMAX+3)
@@ -173,28 +178,29 @@ SUBROUTINE SSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF (LWORK .LT. MINSIZE .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.MINSIZE .AND. .NOT.LQUERY ) THEN
INFO = -7
END IF
-*
-* Quick return if possible
-*
*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'SSYTRI2', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- WORK(1)=MINSIZE
+ WORK( 1 ) = SROUNDUP_LWORK( MINSIZE )
RETURN
END IF
+*
+* Quick return if possible
+*
IF( N.EQ.0 )
$ RETURN
-
- IF( NBMAX .GE. N ) THEN
+*
+ IF( NBMAX.GE.N ) THEN
CALL SSYTRI( UPLO, N, A, LDA, IPIV, WORK, INFO )
ELSE
CALL SSYTRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO )
END IF
+*
RETURN
*
* End of SSYTRI2
diff --git a/lapack-netlib/SRC/ssytri_3.f b/lapack-netlib/SRC/ssytri_3.f
index bca01105d5..f0152a1499 100644
--- a/lapack-netlib/SRC/ssytri_3.f
+++ b/lapack-netlib/SRC/ssytri_3.f
@@ -119,16 +119,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is REAL array, dimension (N+NB+1)*(NB+3).
+*> WORK is REAL array, dimension (MAX(1,LWORK)).
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >= (N+NB+1)*(NB+3).
+*> The length of WORK.
+*> If N = 0, LWORK >= 1, else LWORK >= (N+NB+1)*(NB+3).
*>
-*> If LDWORK = -1, then a workspace query is assumed;
+*> If LWORK = -1, then a workspace query is assumed;
*> the routine only calculates the optimal size of the optimal
*> size of the WORK array, returns this value as the first
*> entry of the WORK array, and no error message related to
@@ -209,8 +210,13 @@ SUBROUTINE SSYTRI_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
*
* Determine the block size
*
- NB = MAX( 1, ILAENV( 1, 'SSYTRI_3', UPLO, N, -1, -1, -1 ) )
- LWKOPT = ( N+NB+1 ) * ( NB+3 )
+ IF( N.EQ.0 ) THEN
+ LWKOPT = 1
+ ELSE
+ NB = MAX( 1, ILAENV( 1, 'SSYTRI_3', UPLO, N, -1, -1, -1 ) )
+ LWKOPT = ( N+NB+1 ) * ( NB+3 )
+ END IF
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
@@ -218,7 +224,7 @@ SUBROUTINE SSYTRI_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF ( LWORK .LT. LWKOPT .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKOPT .AND. .NOT.LQUERY ) THEN
INFO = -8
END IF
*
@@ -226,7 +232,6 @@ SUBROUTINE SSYTRI_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
CALL XERBLA( 'SSYTRI_3', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
RETURN
END IF
*
@@ -237,7 +242,7 @@ SUBROUTINE SSYTRI_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
*
CALL SSYTRI_3X( UPLO, N, A, LDA, E, IPIV, WORK, NB, INFO )
*
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKOPT )
*
RETURN
*
diff --git a/lapack-netlib/SRC/ssytrs_aa.f b/lapack-netlib/SRC/ssytrs_aa.f
index 12fca0c716..265cf0c1dd 100644
--- a/lapack-netlib/SRC/ssytrs_aa.f
+++ b/lapack-netlib/SRC/ssytrs_aa.f
@@ -105,7 +105,13 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,3*N-2).
+*> The dimension of the array WORK.
+*> If MIN(N,NRHS) = 0, LWORK >= 1, else LWORK >= 3*N-2.
+*>
+*> If LWORK = -1, then a workspace query is assumed; the routine
+*> only calculates the minimal size of the WORK array, returns
+*> this value as the first entry of the WORK array, and no error
+*> message related to LWORK is issued by XERBLA.
*> \endverbatim
*>
*> \param[out] INFO
@@ -141,7 +147,7 @@ SUBROUTINE SSYTRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
* ..
* .. Array Arguments ..
INTEGER IPIV( * )
- REAL A( LDA, * ), B( LDB, * ), WORK( * )
+ REAL A( LDA, * ), B( LDB, * ), WORK( * )
* ..
*
* =====================================================================
@@ -151,24 +157,31 @@ SUBROUTINE SSYTRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, UPPER
- INTEGER K, KP, LWKOPT
+ INTEGER K, KP, LWKMIN
* ..
* .. External Functions ..
LOGICAL LSAME
+ EXTERNAL LSAME
REAL SROUNDUP_LWORK
- EXTERNAL LSAME, SROUNDUP_LWORK
+ EXTERNAL SROUNDUP_LWORK
* ..
* .. External Subroutines ..
EXTERNAL SGTSV, SSWAP, SLACPY, STRSM, XERBLA
* ..
* .. Intrinsic Functions ..
- INTRINSIC MAX
+ INTRINSIC MIN, MAX
* ..
* .. Executable Statements ..
*
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
+ IF( MIN( N, NRHS ).EQ.0 ) THEN
+ LWKMIN = 1
+ ELSE
+ LWKMIN = 3*N-2
+ END IF
+*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -179,21 +192,20 @@ SUBROUTINE SSYTRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
INFO = -5
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -8
- ELSE IF( LWORK.LT.MAX( 1, 3*N-2 ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -10
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'SSYTRS_AA', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- LWKOPT = (3*N-2)
- WORK( 1 ) = SROUNDUP_LWORK(LWKOPT)
+ WORK( 1 ) = SROUNDUP_LWORK( LWKMIN )
RETURN
END IF
*
* Quick return if possible
*
- IF( N.EQ.0 .OR. NRHS.EQ.0 )
+ IF( MIN( N, NRHS ).EQ.0 )
$ RETURN
*
IF( UPPER ) THEN
diff --git a/lapack-netlib/SRC/zgebrd.f b/lapack-netlib/SRC/zgebrd.f
index f1791c6a4b..c1a6169a77 100644
--- a/lapack-netlib/SRC/zgebrd.f
+++ b/lapack-netlib/SRC/zgebrd.f
@@ -122,7 +122,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of the array WORK. LWORK >= max(1,M,N).
+*> The length of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MAX(M,N), otherwise.
*> For optimum performance LWORK >= (M+N)*NB, where NB
*> is the optimal blocksize.
*>
@@ -147,7 +148,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16GEcomputational
+*> \ingroup gebrd
*
*> \par Further Details:
* =====================
@@ -223,8 +224,8 @@ SUBROUTINE ZGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
* ..
* .. Local Scalars ..
LOGICAL LQUERY
- INTEGER I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB,
- $ NBMIN, NX, WS
+ INTEGER I, IINFO, J, LDWRKX, LDWRKY, LWKMIN, LWKOPT,
+ $ MINMN, NB, NBMIN, NX, WS
* ..
* .. External Subroutines ..
EXTERNAL XERBLA, ZGEBD2, ZGEMM, ZLABRD
@@ -241,9 +242,17 @@ SUBROUTINE ZGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
* Test the input parameters
*
INFO = 0
- NB = MAX( 1, ILAENV( 1, 'ZGEBRD', ' ', M, N, -1, -1 ) )
- LWKOPT = ( M+N )*NB
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWKMIN = 1
+ LWKOPT = 1
+ ELSE
+ LWKMIN = MAX( M, N )
+ NB = MAX( 1, ILAENV( 1, 'ZGEBRD', ' ', M, N, -1, -1 ) )
+ LWKOPT = ( M+N )*NB
+ END IF
WORK( 1 ) = DBLE( LWKOPT )
+*
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -251,7 +260,7 @@ SUBROUTINE ZGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
INFO = -2
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, M, N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -10
END IF
IF( INFO.LT.0 ) THEN
@@ -263,7 +272,6 @@ SUBROUTINE ZGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
*
* Quick return if possible
*
- MINMN = MIN( M, N )
IF( MINMN.EQ.0 ) THEN
WORK( 1 ) = 1
RETURN
@@ -282,7 +290,7 @@ SUBROUTINE ZGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
* Determine when to switch from blocked to unblocked code.
*
IF( NX.LT.MINMN ) THEN
- WS = ( M+N )*NB
+ WS = LWKOPT
IF( LWORK.LT.WS ) THEN
*
* Not enough work space for the optimal NB, consider using
diff --git a/lapack-netlib/SRC/zgehrd.f b/lapack-netlib/SRC/zgehrd.f
index e18493cf97..0f4424ded6 100644
--- a/lapack-netlib/SRC/zgehrd.f
+++ b/lapack-netlib/SRC/zgehrd.f
@@ -89,7 +89,7 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX*16 array, dimension (LWORK)
+*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK))
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
@@ -120,7 +120,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16GEcomputational
+*> \ingroup gehrd
*
*> \par Further Details:
* =====================
@@ -173,7 +173,7 @@ SUBROUTINE ZGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
INTEGER IHI, ILO, INFO, LDA, LWORK, N
* ..
* .. Array Arguments ..
- COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * )
+ COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * )
* ..
*
* =====================================================================
@@ -182,7 +182,7 @@ SUBROUTINE ZGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
INTEGER NBMAX, LDT, TSIZE
PARAMETER ( NBMAX = 64, LDT = NBMAX+1,
$ TSIZE = LDT*NBMAX )
- COMPLEX*16 ZERO, ONE
+ COMPLEX*16 ZERO, ONE
PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ),
$ ONE = ( 1.0D+0, 0.0D+0 ) )
* ..
@@ -190,7 +190,7 @@ SUBROUTINE ZGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
LOGICAL LQUERY
INTEGER I, IB, IINFO, IWT, J, LDWORK, LWKOPT, NB,
$ NBMIN, NH, NX
- COMPLEX*16 EI
+ COMPLEX*16 EI
* ..
* .. External Subroutines ..
EXTERNAL ZAXPY, ZGEHD2, ZGEMM, ZLAHR2, ZLARFB, ZTRMM,
@@ -221,12 +221,18 @@ SUBROUTINE ZGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
INFO = -8
END IF
*
+ NH = IHI - ILO + 1
IF( INFO.EQ.0 ) THEN
*
* Compute the workspace requirements
*
- NB = MIN( NBMAX, ILAENV( 1, 'ZGEHRD', ' ', N, ILO, IHI, -1 ) )
- LWKOPT = N*NB + TSIZE
+ IF( NH.LE.1 ) THEN
+ LWKOPT = 1
+ ELSE
+ NB = MIN( NBMAX, ILAENV( 1, 'ZGEHRD', ' ', N, ILO, IHI,
+ $ -1 ) )
+ LWKOPT = N*NB + TSIZE
+ END IF
WORK( 1 ) = LWKOPT
ENDIF
*
@@ -248,7 +254,6 @@ SUBROUTINE ZGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
*
* Quick return if possible
*
- NH = IHI - ILO + 1
IF( NH.LE.1 ) THEN
WORK( 1 ) = 1
RETURN
@@ -268,7 +273,7 @@ SUBROUTINE ZGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
*
* Determine if workspace is large enough for blocked code
*
- IF( LWORK.LT.N*NB+TSIZE ) THEN
+ IF( LWORK.LT.LWKOPT ) THEN
*
* Not enough workspace to use optimal NB: determine the
* minimum value of NB, and reduce NB or force use of
diff --git a/lapack-netlib/SRC/zgelq.f b/lapack-netlib/SRC/zgelq.f
index de7c9a3784..86610e8019 100644
--- a/lapack-netlib/SRC/zgelq.f
+++ b/lapack-netlib/SRC/zgelq.f
@@ -98,7 +98,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1 or -2, then a workspace query is assumed. The routine
*> only calculates the sizes of the T and WORK arrays, returns these
*> values as the first entries of the T and WORK arrays, and no error
@@ -166,6 +166,8 @@
*> the LQ factorization.
*> \endverbatim
*>
+*> \ingroup gelq
+*>
* =====================================================================
SUBROUTINE ZGELQ( M, N, A, LDA, T, TSIZE, WORK, LWORK,
$ INFO )
diff --git a/lapack-netlib/SRC/zgelqf.f b/lapack-netlib/SRC/zgelqf.f
index 6c295eecec..e988ea818a 100644
--- a/lapack-netlib/SRC/zgelqf.f
+++ b/lapack-netlib/SRC/zgelqf.f
@@ -93,7 +93,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,M).
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M, otherwise.
*> For optimum performance LWORK >= M*NB, where NB is the
*> optimal blocksize.
*>
@@ -118,7 +119,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16GEcomputational
+*> \ingroup gelqf
*
*> \par Further Details:
* =====================
@@ -174,9 +175,8 @@ SUBROUTINE ZGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
* Test the input arguments
*
INFO = 0
+ K = MIN( M, N )
NB = ILAENV( 1, 'ZGELQF', ' ', M, N, -1, -1 )
- LWKOPT = M*NB
- WORK( 1 ) = LWKOPT
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -184,19 +184,25 @@ SUBROUTINE ZGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
INFO = -2
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
- INFO = -7
+ ELSE IF( .NOT.LQUERY ) THEN
+ IF( LWORK.LE.0 .OR. ( N.GT.0 .AND. LWORK.LT.MAX( 1, M ) ) )
+ $ INFO = -7
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'ZGELQF', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
+ IF( K.EQ.0 ) THEN
+ LWKOPT = 1
+ ELSE
+ LWKOPT = M*NB
+ END IF
+ WORK( 1 ) = LWKOPT
RETURN
END IF
*
* Quick return if possible
*
- K = MIN( M, N )
IF( K.EQ.0 ) THEN
WORK( 1 ) = 1
RETURN
diff --git a/lapack-netlib/SRC/zgemlq.f b/lapack-netlib/SRC/zgemlq.f
index 41cd1c0595..11489087a4 100644
--- a/lapack-netlib/SRC/zgemlq.f
+++ b/lapack-netlib/SRC/zgemlq.f
@@ -109,16 +109,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
+*> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1, then a workspace query is assumed. The routine
*> only calculates the size of the WORK array, returns this
-*> value as WORK(1), and no error message related to WORK
+*> value as WORK(1), and no error message related to WORK
*> is issued by XERBLA.
*> \endverbatim
*>
@@ -142,7 +143,7 @@
*>
*> \verbatim
*>
-*> These details are particular for this LAPACK implementation. Users should not
+*> These details are particular for this LAPACK implementation. Users should not
*> take them for granted. These details may change in the future, and are not likely
*> true for another LAPACK implementation. These details are relevant if one wants
*> to try to understand the code. They are not part of the interface.
@@ -158,11 +159,13 @@
*> block sizes MB and NB returned by ILAENV, ZGELQ will use either
*> ZLASWLQ (if the matrix is wide-and-short) or ZGELQT to compute
*> the LQ factorization.
-*> This version of ZGEMLQ will use either ZLAMSWLQ or ZGEMLQT to
+*> This version of ZGEMLQ will use either ZLAMSWLQ or ZGEMLQT to
*> multiply matrix Q by another matrix.
*> Further Details in ZLAMSWLQ or ZGEMLQT.
*> \endverbatim
*>
+*> \ingroup gemlq
+*>
* =====================================================================
SUBROUTINE ZGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ C, LDC, WORK, LWORK, INFO )
@@ -184,7 +187,7 @@ SUBROUTINE ZGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
* ..
* .. Local Scalars ..
LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER MB, NB, LW, NBLCKS, MN
+ INTEGER MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -200,7 +203,7 @@ SUBROUTINE ZGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Test the input arguments
*
- LQUERY = LWORK.EQ.-1
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'C' )
LEFT = LSAME( SIDE, 'L' )
@@ -215,6 +218,13 @@ SUBROUTINE ZGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
LW = M * MB
MN = N
END IF
+*
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
*
IF( ( NB.GT.K ) .AND. ( MN.GT.K ) ) THEN
IF( MOD( MN - K, NB - K ) .EQ. 0 ) THEN
@@ -243,7 +253,7 @@ SUBROUTINE ZGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
INFO = -9
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
INFO = -11
- ELSE IF( ( LWORK.LT.MAX( 1, LW ) ) .AND. ( .NOT.LQUERY ) ) THEN
+ ELSE IF( ( LWORK.LT.LWMIN ) .AND. ( .NOT.LQUERY ) ) THEN
INFO = -13
END IF
*
@@ -260,7 +270,7 @@ SUBROUTINE ZGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Quick return if possible
*
- IF( MIN( M, N, K ).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
*
diff --git a/lapack-netlib/SRC/zgemqr.f b/lapack-netlib/SRC/zgemqr.f
index c83eaff2f1..d14d74fe28 100644
--- a/lapack-netlib/SRC/zgemqr.f
+++ b/lapack-netlib/SRC/zgemqr.f
@@ -111,16 +111,17 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
+*> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1, then a workspace query is assumed. The routine
*> only calculates the size of the WORK array, returns this
-*> value as WORK(1), and no error message related to WORK
+*> value as WORK(1), and no error message related to WORK
*> is issued by XERBLA.
*> \endverbatim
*>
@@ -144,7 +145,7 @@
*>
*> \verbatim
*>
-*> These details are particular for this LAPACK implementation. Users should not
+*> These details are particular for this LAPACK implementation. Users should not
*> take them for granted. These details may change in the future, and are not likely
*> true for another LAPACK implementation. These details are relevant if one wants
*> to try to understand the code. They are not part of the interface.
@@ -166,6 +167,8 @@
*>
*> \endverbatim
*>
+*> \ingroup gemqr
+*>
* =====================================================================
SUBROUTINE ZGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ C, LDC, WORK, LWORK, INFO )
@@ -187,7 +190,7 @@ SUBROUTINE ZGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
* ..
* .. Local Scalars ..
LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER MB, NB, LW, NBLCKS, MN
+ INTEGER MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -203,7 +206,7 @@ SUBROUTINE ZGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Test the input arguments
*
- LQUERY = LWORK.EQ.-1
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'C' )
LEFT = LSAME( SIDE, 'L' )
@@ -218,6 +221,13 @@ SUBROUTINE ZGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
LW = MB * NB
MN = N
END IF
+*
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
*
IF( ( MB.GT.K ) .AND. ( MN.GT.K ) ) THEN
IF( MOD( MN - K, MB - K ).EQ.0 ) THEN
@@ -246,12 +256,12 @@ SUBROUTINE ZGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
INFO = -9
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
INFO = -11
- ELSE IF( ( LWORK.LT.MAX( 1, LW ) ) .AND. ( .NOT.LQUERY ) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
INFO = -13
END IF
*
IF( INFO.EQ.0 ) THEN
- WORK( 1 ) = LW
+ WORK( 1 ) = LWMIN
END IF
*
IF( INFO.NE.0 ) THEN
@@ -263,7 +273,7 @@ SUBROUTINE ZGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
*
* Quick return if possible
*
- IF( MIN( M, N, K ).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
*
@@ -276,7 +286,7 @@ SUBROUTINE ZGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
$ NB, C, LDC, WORK, LWORK, INFO )
END IF
*
- WORK( 1 ) = LW
+ WORK( 1 ) = LWMIN
*
RETURN
*
diff --git a/lapack-netlib/SRC/zgeqlf.f b/lapack-netlib/SRC/zgeqlf.f
index 94721540c5..a27612c640 100644
--- a/lapack-netlib/SRC/zgeqlf.f
+++ b/lapack-netlib/SRC/zgeqlf.f
@@ -88,7 +88,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,N).
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
*> For optimum performance LWORK >= N*NB, where NB is
*> the optimal blocksize.
*>
@@ -113,7 +114,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16GEcomputational
+*> \ingroup geqlf
*
*> \par Further Details:
* =====================
@@ -188,8 +189,9 @@ SUBROUTINE ZGEQLF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
END IF
WORK( 1 ) = LWKOPT
*
- IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
- INFO = -7
+ IF( .NOT.LQUERY ) THEN
+ IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) )
+ $ INFO = -7
END IF
END IF
*
diff --git a/lapack-netlib/SRC/zgeqp3rk.f b/lapack-netlib/SRC/zgeqp3rk.f
index 247a3c3797..01dcce0ded 100644
--- a/lapack-netlib/SRC/zgeqp3rk.f
+++ b/lapack-netlib/SRC/zgeqp3rk.f
@@ -428,7 +428,8 @@
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*. LWORK >= N+NRHS-1
+*> LWORK >= 1, if MIN(M,N) = 0, and
+*> LWORK >= N+NRHS-1, otherwise.
*> For optimal performance LWORK >= NB*( N+NRHS+1 ),
*> where NB is the optimal block size for ZGEQP3RK returned
*> by ILAENV. Minimal block size MINNB=2.
diff --git a/lapack-netlib/SRC/zgeqr.f b/lapack-netlib/SRC/zgeqr.f
index 20a80d0835..7df9c2403d 100644
--- a/lapack-netlib/SRC/zgeqr.f
+++ b/lapack-netlib/SRC/zgeqr.f
@@ -99,7 +99,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1 or -2, then a workspace query is assumed. The routine
*> only calculates the sizes of the T and WORK arrays, returns these
*> values as the first entries of the T and WORK arrays, and no error
@@ -168,6 +168,8 @@
*>
*> \endverbatim
*>
+*> \ingroup geqr
+*>
* =====================================================================
SUBROUTINE ZGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
$ INFO )
@@ -188,7 +190,7 @@ SUBROUTINE ZGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, LMINWS, MINT, MINW
- INTEGER MB, NB, MINTSZ, NBLCKS
+ INTEGER MB, NB, MINTSZ, NBLCKS, LWMIN, LWREQ
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -244,8 +246,10 @@ SUBROUTINE ZGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
*
* Determine if the workspace size satisfies minimal size
*
+ LWMIN = MAX( 1, N )
+ LWREQ = MAX( 1, N*NB )
LMINWS = .FALSE.
- IF( ( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) .OR. LWORK.LT.NB*N )
+ IF( ( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) .OR. LWORK.LT.LWREQ )
$ .AND. ( LWORK.GE.N ) .AND. ( TSIZE.GE.MINTSZ )
$ .AND. ( .NOT.LQUERY ) ) THEN
IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) ) THEN
@@ -253,7 +257,7 @@ SUBROUTINE ZGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
NB = 1
MB = M
END IF
- IF( LWORK.LT.NB*N ) THEN
+ IF( LWORK.LT.LWREQ ) THEN
LMINWS = .TRUE.
NB = 1
END IF
@@ -268,7 +272,7 @@ SUBROUTINE ZGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
ELSE IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 )
$ .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
INFO = -6
- ELSE IF( ( LWORK.LT.MAX( 1, N*NB ) ) .AND. ( .NOT.LQUERY )
+ ELSE IF( ( LWORK.LT.LWREQ ) .AND. ( .NOT.LQUERY )
$ .AND. ( .NOT.LMINWS ) ) THEN
INFO = -8
END IF
@@ -282,9 +286,9 @@ SUBROUTINE ZGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
T( 2 ) = MB
T( 3 ) = NB
IF( MINW ) THEN
- WORK( 1 ) = MAX( 1, N )
+ WORK( 1 ) = LWMIN
ELSE
- WORK( 1 ) = MAX( 1, NB*N )
+ WORK( 1 ) = LWREQ
END IF
END IF
IF( INFO.NE.0 ) THEN
@@ -309,7 +313,7 @@ SUBROUTINE ZGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
$ LWORK, INFO )
END IF
*
- WORK( 1 ) = MAX( 1, NB*N )
+ WORK( 1 ) = LWREQ
*
RETURN
*
diff --git a/lapack-netlib/SRC/zgeqrfp.f b/lapack-netlib/SRC/zgeqrfp.f
index 73bcde6674..3562de36ec 100644
--- a/lapack-netlib/SRC/zgeqrfp.f
+++ b/lapack-netlib/SRC/zgeqrfp.f
@@ -97,7 +97,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,N).
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
*> For optimum performance LWORK >= N*NB, where NB is
*> the optimal blocksize.
*>
@@ -122,7 +123,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16GEcomputational
+*> \ingroup geqrfp
*
*> \par Further Details:
* =====================
@@ -162,8 +163,8 @@ SUBROUTINE ZGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
* .. Local Scalars ..
LOGICAL LQUERY
- INTEGER I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
- $ NBMIN, NX
+ INTEGER I, IB, IINFO, IWS, K, LDWORK, LWKMIN, LWKOPT,
+ $ NB, NBMIN, NX
* ..
* .. External Subroutines ..
EXTERNAL XERBLA, ZGEQR2P, ZLARFB, ZLARFT
@@ -181,8 +182,16 @@ SUBROUTINE ZGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
INFO = 0
NB = ILAENV( 1, 'ZGEQRF', ' ', M, N, -1, -1 )
- LWKOPT = N*NB
+ K = MIN( M, N )
+ IF( K.EQ.0 ) THEN
+ LWKMIN = 1
+ LWKOPT = 1
+ ELSE
+ LWKMIN = N
+ LWKOPT = N*NB
+ END IF
WORK( 1 ) = LWKOPT
+*
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
@@ -190,7 +199,7 @@ SUBROUTINE ZGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
INFO = -2
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -7
END IF
IF( INFO.NE.0 ) THEN
@@ -202,7 +211,6 @@ SUBROUTINE ZGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
* Quick return if possible
*
- K = MIN( M, N )
IF( K.EQ.0 ) THEN
WORK( 1 ) = 1
RETURN
@@ -210,7 +218,7 @@ SUBROUTINE ZGEQRFP( M, N, A, LDA, TAU, WORK, LWORK, INFO )
*
NBMIN = 2
NX = 0
- IWS = N
+ IWS = LWKMIN
IF( NB.GT.1 .AND. NB.LT.K ) THEN
*
* Determine when to cross over from blocked to unblocked code.
diff --git a/lapack-netlib/SRC/zgesvj.f b/lapack-netlib/SRC/zgesvj.f
index 6cd2335f24..2be45d826e 100644
--- a/lapack-netlib/SRC/zgesvj.f
+++ b/lapack-netlib/SRC/zgesvj.f
@@ -200,23 +200,25 @@
*> \verbatim
*> LDV is INTEGER
*> The leading dimension of the array V, LDV >= 1.
-*> If JOBV = 'V', then LDV >= max(1,N).
-*> If JOBV = 'A', then LDV >= max(1,MV) .
+*> If JOBV = 'V', then LDV >= MAX(1,N).
+*> If JOBV = 'A', then LDV >= MAX(1,MV) .
*> \endverbatim
*>
*> \param[in,out] CWORK
*> \verbatim
-*> CWORK is COMPLEX*16 array, dimension (max(1,LWORK))
+*> CWORK is COMPLEX*16 array, dimension (MAX(1,LWORK))
*> Used as workspace.
-*> If on entry LWORK = -1, then a workspace query is assumed and
-*> no computation is done; CWORK(1) is set to the minial (and optimal)
-*> length of CWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER.
-*> Length of CWORK, LWORK >= M+N.
+*> Length of CWORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M+N, otherwise.
+*>
+*> If on entry LWORK = -1, then a workspace query is assumed and
+*> no computation is done; CWORK(1) is set to the minial (and optimal)
+*> length of CWORK.
*> \endverbatim
*>
*> \param[in,out] RWORK
@@ -247,15 +249,17 @@
*> RWORK(6) = the largest absolute value over all sines of the
*> Jacobi rotation angles in the last sweep. It can be
*> useful for a post festum analysis.
-*> If on entry LRWORK = -1, then a workspace query is assumed and
-*> no computation is done; RWORK(1) is set to the minial (and optimal)
-*> length of RWORK.
*> \endverbatim
*>
*> \param[in] LRWORK
*> \verbatim
*> LRWORK is INTEGER
-*> Length of RWORK, LRWORK >= MAX(6,N).
+*> Length of RWORK.
+*> LRWORK >= 1, if MIN(M,N) = 0, and LRWORK >= MAX(6,N), otherwise.
+*>
+*> If on entry LRWORK = -1, then a workspace query is assumed and
+*> no computation is done; RWORK(1) is set to the minial (and optimal)
+*> length of RWORK.
*> \endverbatim
*>
*> \param[out] INFO
@@ -276,7 +280,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16GEcomputational
+*> \ingroup gesvj
*
*> \par Further Details:
* =====================
@@ -367,23 +371,25 @@ SUBROUTINE ZGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
*
* .. Local Parameters ..
DOUBLE PRECISION ZERO, HALF, ONE
- PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0)
- COMPLEX*16 CZERO, CONE
- PARAMETER ( CZERO = (0.0D0, 0.0D0), CONE = (1.0D0, 0.0D0) )
- INTEGER NSWEEP
- PARAMETER ( NSWEEP = 30 )
+ PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0)
+ COMPLEX*16 CZERO, CONE
+ PARAMETER ( CZERO = (0.0D0, 0.0D0), CONE = (1.0D0, 0.0D0) )
+ INTEGER NSWEEP
+ PARAMETER ( NSWEEP = 30 )
* ..
* .. Local Scalars ..
- COMPLEX*16 AAPQ, OMPQ
- DOUBLE PRECISION AAPP, AAPP0, AAPQ1, AAQQ, APOAQ, AQOAP, BIG,
- $ BIGTHETA, CS, CTOL, EPSLN, MXAAPQ,
- $ MXSINJ, ROOTBIG, ROOTEPS, ROOTSFMIN, ROOTTOL,
- $ SKL, SFMIN, SMALL, SN, T, TEMP1, THETA, THSIGN, TOL
- INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
- $ ISWROT, jbc, jgl, KBL, LKAHEAD, MVL, N2, N34,
- $ N4, NBL, NOTROT, p, PSKIPPED, q, ROWSKIP, SWBAND
- LOGICAL APPLV, GOSCALE, LOWER, LQUERY, LSVEC, NOSCALE, ROTOK,
- $ RSVEC, UCTOL, UPPER
+ COMPLEX*16 AAPQ, OMPQ
+ DOUBLE PRECISION AAPP, AAPP0, AAPQ1, AAQQ, APOAQ, AQOAP, BIG,
+ $ BIGTHETA, CS, CTOL, EPSLN, MXAAPQ,
+ $ MXSINJ, ROOTBIG, ROOTEPS, ROOTSFMIN, ROOTTOL,
+ $ SKL, SFMIN, SMALL, SN, T, TEMP1, THETA, THSIGN,
+ $ TOL
+ INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
+ $ ISWROT, jbc, jgl, KBL, LKAHEAD, MVL, N2, N34,
+ $ N4, NBL, NOTROT, p, PSKIPPED, q, ROWSKIP,
+ $ SWBAND, MINMN, LWMIN, LRWMIN
+ LOGICAL APPLV, GOSCALE, LOWER, LQUERY, LSVEC, NOSCALE,
+ $ ROTOK, RSVEC, UCTOL, UPPER
* ..
* ..
* .. Intrinsic Functions ..
@@ -422,7 +428,16 @@ SUBROUTINE ZGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
UPPER = LSAME( JOBA, 'U' )
LOWER = LSAME( JOBA, 'L' )
*
- LQUERY = ( LWORK .EQ. -1 ) .OR. ( LRWORK .EQ. -1 )
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWMIN = 1
+ LRWMIN = 1
+ ELSE
+ LWMIN = M+N
+ LRWMIN = MAX( 6, N )
+ END IF
+*
+ LQUERY = ( LWORK.EQ.-1 ) .OR. ( LRWORK.EQ.-1 )
IF( .NOT.( UPPER .OR. LOWER .OR. LSAME( JOBA, 'G' ) ) ) THEN
INFO = -1
ELSE IF( .NOT.( LSVEC .OR. UCTOL .OR. LSAME( JOBU, 'N' ) ) ) THEN
@@ -442,9 +457,9 @@ SUBROUTINE ZGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
INFO = -11
ELSE IF( UCTOL .AND. ( RWORK( 1 ).LE.ONE ) ) THEN
INFO = -12
- ELSE IF( ( LWORK.LT.( M+N ) ) .AND. ( .NOT.LQUERY ) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. ( .NOT.LQUERY ) ) THEN
INFO = -13
- ELSE IF( ( LRWORK.LT.MAX( N, 6 ) ) .AND. ( .NOT.LQUERY ) ) THEN
+ ELSE IF( LRWORK.LT.LRWMIN .AND. ( .NOT.LQUERY ) ) THEN
INFO = -15
ELSE
INFO = 0
@@ -454,15 +469,15 @@ SUBROUTINE ZGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'ZGESVJ', -INFO )
RETURN
- ELSE IF ( LQUERY ) THEN
- CWORK(1) = M + N
- RWORK(1) = MAX( N, 6 )
+ ELSE IF( LQUERY ) THEN
+ CWORK( 1 ) = LWMIN
+ RWORK( 1 ) = LRWMIN
RETURN
END IF
*
* #:) Quick return for void matrix
*
- IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )RETURN
+ IF( MINMN.EQ.0 ) RETURN
*
* Set numerical parameters
* The stopping criterion for Jacobi rotations is
diff --git a/lapack-netlib/SRC/zgetri.f b/lapack-netlib/SRC/zgetri.f
index 41782841c9..f3806a77c2 100644
--- a/lapack-netlib/SRC/zgetri.f
+++ b/lapack-netlib/SRC/zgetri.f
@@ -107,7 +107,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16GEcomputational
+*> \ingroup getri
*
* =====================================================================
SUBROUTINE ZGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
@@ -152,7 +152,7 @@ SUBROUTINE ZGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
*
INFO = 0
NB = ILAENV( 1, 'ZGETRI', ' ', N, -1, -1, -1 )
- LWKOPT = N*NB
+ LWKOPT = MAX( 1, N*NB )
WORK( 1 ) = LWKOPT
LQUERY = ( LWORK.EQ.-1 )
IF( N.LT.0 ) THEN
diff --git a/lapack-netlib/SRC/zgetsls.f b/lapack-netlib/SRC/zgetsls.f
index 17c6d5146d..26311c611b 100644
--- a/lapack-netlib/SRC/zgetsls.f
+++ b/lapack-netlib/SRC/zgetsls.f
@@ -127,7 +127,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*> If LWORK = -1 or -2, then a workspace query is assumed.
*> If LWORK = -1, the routine calculates optimal size of WORK for the
*> optimal performance and returns this value in WORK(1).
@@ -154,7 +154,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16GEsolve
+*> \ingroup getsls
*
* =====================================================================
SUBROUTINE ZGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
@@ -192,7 +192,7 @@ SUBROUTINE ZGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
* .. External Functions ..
LOGICAL LSAME
DOUBLE PRECISION DLAMCH, ZLANGE
- EXTERNAL LSAME, DLABAD, DLAMCH, ZLANGE
+ EXTERNAL LSAME, DLAMCH, ZLANGE
* ..
* .. External Subroutines ..
EXTERNAL ZGEQR, ZGEMQR, ZLASCL, ZLASET,
@@ -229,7 +229,10 @@ SUBROUTINE ZGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
*
* Determine the optimum and minimum LWORK
*
- IF( M.GE.N ) THEN
+ IF( MIN( M, N, NRHS ).EQ.0 ) THEN
+ WSIZEO = 1
+ WSIZEM = 1
+ ELSE IF( M.GE.N ) THEN
CALL ZGEQR( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 )
TSZO = INT( TQ( 1 ) )
LWO = INT( WORKQ( 1 ) )
@@ -297,7 +300,6 @@ SUBROUTINE ZGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
*
SMLNUM = DLAMCH( 'S' ) / DLAMCH( 'P' )
BIGNUM = ONE / SMLNUM
- CALL DLABAD( SMLNUM, BIGNUM )
*
* Scale A, B if max element outside range [SMLNUM,BIGNUM]
*
diff --git a/lapack-netlib/SRC/zgetsqrhrt.f b/lapack-netlib/SRC/zgetsqrhrt.f
index 5f0167937e..e7ce993aa3 100644
--- a/lapack-netlib/SRC/zgetsqrhrt.f
+++ b/lapack-netlib/SRC/zgetsqrhrt.f
@@ -131,13 +131,15 @@
*> \param[in] LWORK
*> \verbatim
*> The dimension of the array WORK.
-*> LWORK >= MAX( LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) ),
+*> If MIN(M,N) = 0, LWORK >= 1, else
+*> LWORK >= MAX( 1, LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) ),
*> where
*> NUM_ALL_ROW_BLOCKS = CEIL((M-N)/(MB1-N)),
*> NB1LOCAL = MIN(NB1,N).
*> LWT = NUM_ALL_ROW_BLOCKS * N * NB1LOCAL,
*> LW1 = NB1LOCAL * N,
-*> LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) ),
+*> LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) ).
+*>
*> If LWORK = -1, then a workspace query is assumed.
*> The routine only calculates the optimal size of the WORK
*> array, returns this value as the first entry of the WORK
@@ -160,7 +162,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup comlpex16OTHERcomputational
+*> \ingroup getsqrhrt
*
*> \par Contributors:
* ==================
@@ -212,7 +214,7 @@ SUBROUTINE ZGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
* Test the input arguments
*
INFO = 0
- LQUERY = LWORK.EQ.-1
+ LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
INFO = -1
ELSE IF( N.LT.0 .OR. M.LT.N ) THEN
@@ -225,7 +227,7 @@ SUBROUTINE ZGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
INFO = -5
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -7
- ELSE IF( LDT.LT.MAX( 1, MIN( NB2, N ) ) ) THEN
+ ELSE IF( LDT.LT.MAX( 1, MIN( NB2, N ) ) ) THEN
INFO = -9
ELSE
*
@@ -263,8 +265,9 @@ SUBROUTINE ZGETSQRHRT( M, N, MB1, NB1, NB2, A, LDA, T, LDT, WORK,
LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) )
*
LWORKOPT = MAX( LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) )
+ LWORKOPT = MAX( 1, LWORKOPT )
*
- IF( ( LWORK.LT.MAX( 1, LWORKOPT ) ).AND.(.NOT.LQUERY) ) THEN
+ IF( LWORK.LT.LWORKOPT .AND. .NOT.LQUERY ) THEN
INFO = -11
END IF
*
diff --git a/lapack-netlib/SRC/zgges3.f b/lapack-netlib/SRC/zgges3.f
index 8b3e44f885..8235c2543a 100644
--- a/lapack-netlib/SRC/zgges3.f
+++ b/lapack-netlib/SRC/zgges3.f
@@ -215,7 +215,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= MAX(1,2*N)
+*> For good performance, LWORK must generally be larger.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -260,7 +261,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16GEeigen
+*> \ingroup gges3
*
* =====================================================================
SUBROUTINE ZGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
@@ -300,7 +301,8 @@ SUBROUTINE ZGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
$ LQUERY, WANTST
INTEGER I, ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT,
- $ ILO, IRIGHT, IROWS, IRWRK, ITAU, IWRK, LWKOPT
+ $ ILO, IRIGHT, IROWS, IRWRK, ITAU, IWRK, LWKOPT,
+ $ LWKMIN
DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PVSL,
$ PVSR, SMLNUM
* ..
@@ -309,9 +311,8 @@ SUBROUTINE ZGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
DOUBLE PRECISION DIF( 2 )
* ..
* .. External Subroutines ..
- EXTERNAL DLABAD, XERBLA, ZGEQRF, ZGGBAK, ZGGBAL, ZGGHD3,
- $ ZLAQZ0, ZLACPY, ZLASCL, ZLASET, ZTGSEN, ZUNGQR,
- $ ZUNMQR
+ EXTERNAL XERBLA, ZGEQRF, ZGGBAK, ZGGBAL, ZGGHD3, ZLAQZ0,
+ $ ZLACPY, ZLASCL, ZLASET, ZTGSEN, ZUNGQR, ZUNMQR
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -353,6 +354,8 @@ SUBROUTINE ZGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
*
INFO = 0
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 2*N )
+*
IF( IJOBVL.LE.0 ) THEN
INFO = -1
ELSE IF( IJOBVR.LE.0 ) THEN
@@ -369,7 +372,7 @@ SUBROUTINE ZGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
INFO = -14
ELSE IF( LDVSR.LT.1 .OR. ( ILVSR .AND. LDVSR.LT.N ) ) THEN
INFO = -16
- ELSE IF( LWORK.LT.MAX( 1, 2*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -18
END IF
*
@@ -377,28 +380,32 @@ SUBROUTINE ZGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
*
IF( INFO.EQ.0 ) THEN
CALL ZGEQRF( N, N, B, LDB, WORK, WORK, -1, IERR )
- LWKOPT = MAX( 1, N + INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKMIN, N + INT( WORK( 1 ) ) )
CALL ZUNMQR( 'L', 'C', N, N, N, B, LDB, WORK, A, LDA, WORK,
$ -1, IERR )
- LWKOPT = MAX( LWKOPT, N + INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, N + INT( WORK( 1 ) ) )
IF( ILVSL ) THEN
CALL ZUNGQR( N, N, N, VSL, LDVSL, WORK, WORK, -1, IERR )
LWKOPT = MAX( LWKOPT, N + INT ( WORK( 1 ) ) )
END IF
CALL ZGGHD3( JOBVSL, JOBVSR, N, 1, N, A, LDA, B, LDB, VSL,
$ LDVSL, VSR, LDVSR, WORK, -1, IERR )
- LWKOPT = MAX( LWKOPT, N + INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, N + INT( WORK( 1 ) ) )
CALL ZLAQZ0( 'S', JOBVSL, JOBVSR, N, 1, N, A, LDA, B, LDB,
$ ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK, -1,
$ RWORK, 0, IERR )
- LWKOPT = MAX( LWKOPT, INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, INT( WORK( 1 ) ) )
IF( WANTST ) THEN
CALL ZTGSEN( 0, ILVSL, ILVSR, BWORK, N, A, LDA, B, LDB,
$ ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, SDIM,
$ PVSL, PVSR, DIF, WORK, -1, IDUM, 1, IERR )
- LWKOPT = MAX( LWKOPT, INT ( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKOPT, INT( WORK( 1 ) ) )
+ END IF
+ IF( N.EQ.0 ) THEN
+ WORK( 1 ) = 1
+ ELSE
+ WORK( 1 ) = DCMPLX( LWKOPT )
END IF
- WORK( 1 ) = DCMPLX( LWKOPT )
END IF
*
IF( INFO.NE.0 ) THEN
@@ -420,7 +427,6 @@ SUBROUTINE ZGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
EPS = DLAMCH( 'P' )
SMLNUM = DLAMCH( 'S' )
BIGNUM = ONE / SMLNUM
- CALL DLABAD( SMLNUM, BIGNUM )
SMLNUM = SQRT( SMLNUM ) / EPS
BIGNUM = ONE / SMLNUM
*
diff --git a/lapack-netlib/SRC/zggev3.f b/lapack-netlib/SRC/zggev3.f
index 2d6c745824..0cc0734708 100644
--- a/lapack-netlib/SRC/zggev3.f
+++ b/lapack-netlib/SRC/zggev3.f
@@ -174,7 +174,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= MAX(1,2*N).
+*> For good performance, LWORK must generally be larger.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -208,7 +209,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16GEeigen
+*> \ingroup ggev3
*
* =====================================================================
SUBROUTINE ZGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
@@ -243,7 +244,7 @@ SUBROUTINE ZGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
CHARACTER CHTEMP
INTEGER ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
$ IN, IRIGHT, IROWS, IRWRK, ITAU, IWRK, JC, JR,
- $ LWKOPT
+ $ LWKMIN, LWKOPT
DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
$ SMLNUM, TEMP
COMPLEX*16 X
@@ -252,9 +253,8 @@ SUBROUTINE ZGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
LOGICAL LDUMMA( 1 )
* ..
* .. External Subroutines ..
- EXTERNAL DLABAD, XERBLA, ZGEQRF, ZGGBAK, ZGGBAL, ZGGHD3,
- $ ZLAQZ0, ZLACPY, ZLASCL, ZLASET, ZTGEVC, ZUNGQR,
- $ ZUNMQR
+ EXTERNAL XERBLA, ZGEQRF, ZGGBAK, ZGGBAL, ZGGHD3, ZLAQZ0,
+ $ ZLACPY, ZLASCL, ZLASET, ZTGEVC, ZUNGQR, ZUNMQR
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -301,6 +301,7 @@ SUBROUTINE ZGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
*
INFO = 0
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 2*N )
IF( IJOBVL.LE.0 ) THEN
INFO = -1
ELSE IF( IJOBVR.LE.0 ) THEN
@@ -315,7 +316,7 @@ SUBROUTINE ZGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
INFO = -11
ELSE IF( LDVR.LT.1 .OR. ( ILVR .AND. LDVR.LT.N ) ) THEN
INFO = -13
- ELSE IF( LWORK.LT.MAX( 1, 2*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -15
END IF
*
@@ -323,7 +324,7 @@ SUBROUTINE ZGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
*
IF( INFO.EQ.0 ) THEN
CALL ZGEQRF( N, N, B, LDB, WORK, WORK, -1, IERR )
- LWKOPT = MAX( 1, N+INT( WORK( 1 ) ) )
+ LWKOPT = MAX( LWKMIN, N+INT( WORK( 1 ) ) )
CALL ZUNMQR( 'L', 'C', N, N, N, B, LDB, WORK, A, LDA, WORK,
$ -1, IERR )
LWKOPT = MAX( LWKOPT, N+INT( WORK( 1 ) ) )
@@ -348,7 +349,11 @@ SUBROUTINE ZGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
$ RWORK, 0, IERR )
LWKOPT = MAX( LWKOPT, N+INT( WORK( 1 ) ) )
END IF
- WORK( 1 ) = DCMPLX( LWKOPT )
+ IF( N.EQ.0 ) THEN
+ WORK( 1 ) = 1
+ ELSE
+ WORK( 1 ) = DCMPLX( LWKOPT )
+ END IF
END IF
*
IF( INFO.NE.0 ) THEN
@@ -368,7 +373,6 @@ SUBROUTINE ZGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
EPS = DLAMCH( 'E' )*DLAMCH( 'B' )
SMLNUM = DLAMCH( 'S' )
BIGNUM = ONE / SMLNUM
- CALL DLABAD( SMLNUM, BIGNUM )
SMLNUM = SQRT( SMLNUM ) / EPS
BIGNUM = ONE / SMLNUM
*
diff --git a/lapack-netlib/SRC/zgghd3.f b/lapack-netlib/SRC/zgghd3.f
index b29cdc70a3..08343688de 100644
--- a/lapack-netlib/SRC/zgghd3.f
+++ b/lapack-netlib/SRC/zgghd3.f
@@ -176,14 +176,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX*16 array, dimension (LWORK)
+*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK))
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of the array WORK. LWORK >= 1.
+*> The length of the array WORK. LWORK >= 1.
*> For optimum performance LWORK >= 6*N*NB, where NB is the
*> optimal blocksize.
*>
@@ -208,7 +208,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16OTHERcomputational
+*> \ingroup gghd3
*
*> \par Further Details:
* =====================
@@ -275,7 +275,12 @@ SUBROUTINE ZGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
*
INFO = 0
NB = ILAENV( 1, 'ZGGHD3', ' ', N, ILO, IHI, -1 )
- LWKOPT = MAX( 6*N*NB, 1 )
+ NH = IHI - ILO + 1
+ IF( NH.LE.1 ) THEN
+ LWKOPT = 1
+ ELSE
+ LWKOPT = 6*N*NB
+ END IF
WORK( 1 ) = DCMPLX( LWKOPT )
INITQ = LSAME( COMPQ, 'I' )
WANTQ = INITQ .OR. LSAME( COMPQ, 'V' )
@@ -325,7 +330,6 @@ SUBROUTINE ZGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
*
* Quick return if possible
*
- NH = IHI - ILO + 1
IF( NH.LE.1 ) THEN
WORK( 1 ) = CONE
RETURN
@@ -883,6 +887,7 @@ SUBROUTINE ZGGHD3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
IF ( JCOL.LT.IHI )
$ CALL ZGGHRD( COMPQ2, COMPZ2, N, JCOL, IHI, A, LDA, B, LDB, Q,
$ LDQ, Z, LDZ, IERR )
+*
WORK( 1 ) = DCMPLX( LWKOPT )
*
RETURN
diff --git a/lapack-netlib/SRC/zggqrf.f b/lapack-netlib/SRC/zggqrf.f
index 0388b08743..d8636d6635 100644
--- a/lapack-netlib/SRC/zggqrf.f
+++ b/lapack-netlib/SRC/zggqrf.f
@@ -173,7 +173,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16OTHERcomputational
+*> \ingroup ggqrf
*
*> \par Further Details:
* =====================
@@ -250,7 +250,7 @@ SUBROUTINE ZGGQRF( N, M, P, A, LDA, TAUA, B, LDB, TAUB, WORK,
NB2 = ILAENV( 1, 'ZGERQF', ' ', N, P, -1, -1 )
NB3 = ILAENV( 1, 'ZUNMQR', ' ', N, M, P, -1 )
NB = MAX( NB1, NB2, NB3 )
- LWKOPT = MAX( N, M, P )*NB
+ LWKOPT = MAX( 1, MAX( N, M, P )*NB )
WORK( 1 ) = LWKOPT
LQUERY = ( LWORK.EQ.-1 )
IF( N.LT.0 ) THEN
diff --git a/lapack-netlib/SRC/zggrqf.f b/lapack-netlib/SRC/zggrqf.f
index be912c7726..69c14af245 100644
--- a/lapack-netlib/SRC/zggrqf.f
+++ b/lapack-netlib/SRC/zggrqf.f
@@ -172,7 +172,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16OTHERcomputational
+*> \ingroup ggrqf
*
*> \par Further Details:
* =====================
@@ -249,7 +249,7 @@ SUBROUTINE ZGGRQF( M, P, N, A, LDA, TAUA, B, LDB, TAUB, WORK,
NB2 = ILAENV( 1, 'ZGEQRF', ' ', P, N, -1, -1 )
NB3 = ILAENV( 1, 'ZUNMRQ', ' ', M, N, P, -1 )
NB = MAX( NB1, NB2, NB3 )
- LWKOPT = MAX( N, M, P )*NB
+ LWKOPT = MAX( 1, MAX( N, M, P )*NB )
WORK( 1 ) = LWKOPT
LQUERY = ( LWORK.EQ.-1 )
IF( M.LT.0 ) THEN
diff --git a/lapack-netlib/SRC/zggsvd3.f b/lapack-netlib/SRC/zggsvd3.f
index 71257a7c07..40624f5beb 100644
--- a/lapack-netlib/SRC/zggsvd3.f
+++ b/lapack-netlib/SRC/zggsvd3.f
@@ -277,7 +277,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -332,7 +332,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16GEsing
+*> \ingroup ggsvd3
*
*> \par Contributors:
* ==================
diff --git a/lapack-netlib/SRC/zggsvp3.f b/lapack-netlib/SRC/zggsvp3.f
index f39ccdad31..7b465aaeea 100644
--- a/lapack-netlib/SRC/zggsvp3.f
+++ b/lapack-netlib/SRC/zggsvp3.f
@@ -233,7 +233,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK. LWORK >= 1.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -256,7 +256,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16OTHERcomputational
+*> \ingroup ggsvp3
*
*> \par Further Details:
* =====================
diff --git a/lapack-netlib/SRC/zheevd.f b/lapack-netlib/SRC/zheevd.f
index ba52f9e723..8e86b9e88a 100644
--- a/lapack-netlib/SRC/zheevd.f
+++ b/lapack-netlib/SRC/zheevd.f
@@ -116,8 +116,7 @@
*>
*> \param[out] RWORK
*> \verbatim
-*> RWORK is DOUBLE PRECISION array,
-*> dimension (LRWORK)
+*> RWORK is DOUBLE PRECISION array, dimension (MAX(1,LRWORK))
*> On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK.
*> \endverbatim
*>
@@ -180,7 +179,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEeigen
+*> \ingroup heevd
*
*> \par Further Details:
* =====================
diff --git a/lapack-netlib/SRC/zheevr.f b/lapack-netlib/SRC/zheevr.f
index 1452e04a33..fe6e1a85f7 100644
--- a/lapack-netlib/SRC/zheevr.f
+++ b/lapack-netlib/SRC/zheevr.f
@@ -272,7 +272,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of the array WORK. LWORK >= max(1,2*N).
+*> The length of the array WORK.
+*> If N <= 1, LWORK >= 1, else LWORK >= 2*N.
*> For optimal efficiency, LWORK >= (NB+1)*N,
*> where NB is the max of the blocksize for ZHETRD and for
*> ZUNMTR as returned by ILAENV.
@@ -294,7 +295,8 @@
*> \param[in] LRWORK
*> \verbatim
*> LRWORK is INTEGER
-*> The length of the array RWORK. LRWORK >= max(1,24*N).
+*> The length of the array RWORK.
+*> If N <= 1, LRWORK >= 1, else LRWORK >= 24*N.
*>
*> If LRWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal sizes of the WORK, RWORK
@@ -313,7 +315,8 @@
*> \param[in] LIWORK
*> \verbatim
*> LIWORK is INTEGER
-*> The dimension of the array IWORK. LIWORK >= max(1,10*N).
+*> The dimension of the array IWORK.
+*> If N <= 1, LIWORK >= 1, else LIWORK >= 10*N.
*>
*> If LIWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal sizes of the WORK, RWORK
@@ -338,7 +341,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEeigen
+*> \ingroup heevr
*
*> \par Contributors:
* ==================
@@ -417,9 +420,15 @@ SUBROUTINE ZHEEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
LQUERY = ( ( LWORK.EQ.-1 ) .OR. ( LRWORK.EQ.-1 ) .OR.
$ ( LIWORK.EQ.-1 ) )
*
- LRWMIN = MAX( 1, 24*N )
- LIWMIN = MAX( 1, 10*N )
- LWMIN = MAX( 1, 2*N )
+ IF( N.LE.1 ) THEN
+ LWMIN = 1
+ LRWMIN = 1
+ LIWMIN = 1
+ ELSE
+ LWMIN = 2*N
+ LRWMIN = 24*N
+ LIWMIN = 10*N
+ END IF
*
INFO = 0
IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
@@ -454,7 +463,7 @@ SUBROUTINE ZHEEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
NB = ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1, -1 )
NB = MAX( NB, ILAENV( 1, 'ZUNMTR', UPLO, N, -1, -1, -1 ) )
LWKOPT = MAX( ( NB+1 )*N, LWMIN )
- WORK( 1 ) = LWKOPT
+ WORK( 1 ) = LWKOPT
RWORK( 1 ) = LRWMIN
IWORK( 1 ) = LIWMIN
*
@@ -483,7 +492,7 @@ SUBROUTINE ZHEEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
END IF
*
IF( N.EQ.1 ) THEN
- WORK( 1 ) = 2
+ WORK( 1 ) = 1
IF( ALLEIG .OR. INDEIG ) THEN
M = 1
W( 1 ) = DBLE( A( 1, 1 ) )
@@ -710,7 +719,7 @@ SUBROUTINE ZHEEVR( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
*
* Set WORK(1) to optimal workspace size.
*
- WORK( 1 ) = LWKOPT
+ WORK( 1 ) = LWKOPT
RWORK( 1 ) = LRWMIN
IWORK( 1 ) = LIWMIN
*
diff --git a/lapack-netlib/SRC/zheevr_2stage.f b/lapack-netlib/SRC/zheevr_2stage.f
index 5c576e633b..b1cc7175fa 100644
--- a/lapack-netlib/SRC/zheevr_2stage.f
+++ b/lapack-netlib/SRC/zheevr_2stage.f
@@ -265,7 +265,7 @@
*> indicating the nonzero elements in Z. The i-th eigenvector
*> is nonzero only in elements ISUPPZ( 2*i-1 ) through
*> ISUPPZ( 2*i ). This is an output of ZSTEMR (tridiagonal
-*> matrix). The support of the eigenvectors of A is typically
+*> matrix). The support of the eigenvectors of A is typically
*> 1:N because of the unitary transformations applied by ZUNMTR.
*> Implemented only for RANGE = 'A' or 'I' and IU - IL = N - 1
*> \endverbatim
@@ -279,12 +279,13 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK.
+*> The dimension of the array WORK.
+*> If N <= 1, LWORK must be at least 1.
*> If JOBZ = 'N' and N > 1, LWORK must be queried.
*> LWORK = MAX(1, 26*N, dimension) where
*> dimension = max(stage1,stage2) + (KD+1)*N + N
-*> = N*KD + N*max(KD+1,FACTOPTNB)
-*> + max(2*KD*KD, KD*NTHREADS)
+*> = N*KD + N*max(KD+1,FACTOPTNB)
+*> + max(2*KD*KD, KD*NTHREADS)
*> + (KD+1)*N + N
*> where KD is the blocking size of the reduction,
*> FACTOPTNB is the blocking used by the QR or LQ
@@ -310,7 +311,8 @@
*> \param[in] LRWORK
*> \verbatim
*> LRWORK is INTEGER
-*> The length of the array RWORK. LRWORK >= max(1,24*N).
+*> The length of the array RWORK.
+*> If N <= 1, LRWORK >= 1, else LRWORK >= 24*N.
*>
*> If LRWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal sizes of the WORK, RWORK
@@ -329,7 +331,8 @@
*> \param[in] LIWORK
*> \verbatim
*> LIWORK is INTEGER
-*> The dimension of the array IWORK. LIWORK >= max(1,10*N).
+*> The dimension of the array IWORK.
+*> If N <= 1, LIWORK >= 1, else LIWORK >= 10*N.
*>
*> If LIWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal sizes of the WORK, RWORK
@@ -354,7 +357,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEeigen
+*> \ingroup heevr_2stage
*
*> \par Contributors:
* ==================
@@ -382,7 +385,7 @@
*> http://doi.acm.org/10.1145/2063384.2063394
*>
*> A. Haidar, J. Kurzak, P. Luszczek, 2013.
-*> An improved parallel singular value algorithm and its implementation
+*> An improved parallel singular value algorithm and its implementation
*> for multicore hardware, In Proceedings of 2013 International Conference
*> for High Performance Computing, Networking, Storage and Analysis (SC '13).
*> Denver, Colorado, USA, 2013.
@@ -390,11 +393,11 @@
*> http://doi.acm.org/10.1145/2503210.2503292
*>
*> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
-*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
+*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
*> calculations based on fine-grained memory aware tasks.
*> International Journal of High Performance Computing Applications.
*> Volume 28 Issue 2, Pages 196-209, May 2014.
-*> http://hpc.sagepub.com/content/28/2/196
+*> http://hpc.sagepub.com/content/28/2/196
*>
*> \endverbatim
*
@@ -472,9 +475,16 @@ SUBROUTINE ZHEEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
IB = ILAENV2STAGE( 2, 'ZHETRD_2STAGE', JOBZ, N, KD, -1, -1 )
LHTRD = ILAENV2STAGE( 3, 'ZHETRD_2STAGE', JOBZ, N, KD, IB, -1 )
LWTRD = ILAENV2STAGE( 4, 'ZHETRD_2STAGE', JOBZ, N, KD, IB, -1 )
- LWMIN = N + LHTRD + LWTRD
- LRWMIN = MAX( 1, 24*N )
- LIWMIN = MAX( 1, 10*N )
+*
+ IF( N.LE.1 ) THEN
+ LWMIN = 1
+ LRWMIN = 1
+ LIWMIN = 1
+ ELSE
+ LWMIN = N + LHTRD + LWTRD
+ LRWMIN = 24*N
+ LIWMIN = 10*N
+ END IF
*
INFO = 0
IF( .NOT.( LSAME( JOBZ, 'N' ) ) ) THEN
@@ -535,7 +545,7 @@ SUBROUTINE ZHEEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
END IF
*
IF( N.EQ.1 ) THEN
- WORK( 1 ) = 2
+ WORK( 1 ) = 1
IF( ALLEIG .OR. INDEIG ) THEN
M = 1
W( 1 ) = DBLE( A( 1, 1 ) )
@@ -643,9 +653,9 @@ SUBROUTINE ZHEEVR_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
*
* Call ZHETRD_2STAGE to reduce Hermitian matrix to tridiagonal form.
*
- CALL ZHETRD_2STAGE( JOBZ, UPLO, N, A, LDA, RWORK( INDRD ),
+ CALL ZHETRD_2STAGE( JOBZ, UPLO, N, A, LDA, RWORK( INDRD ),
$ RWORK( INDRE ), WORK( INDTAU ),
- $ WORK( INDHOUS ), LHTRD,
+ $ WORK( INDHOUS ), LHTRD,
$ WORK( INDWK ), LLWORK, IINFO )
*
* If all eigenvalues are desired
diff --git a/lapack-netlib/SRC/zhesv_aa.f b/lapack-netlib/SRC/zhesv_aa.f
index df8498c7a5..b3d4b37256 100644
--- a/lapack-netlib/SRC/zhesv_aa.f
+++ b/lapack-netlib/SRC/zhesv_aa.f
@@ -128,7 +128,7 @@
*> LWORK is INTEGER
*> The length of WORK. LWORK >= MAX(1,2*N,3*N-2), and for best
*> performance LWORK >= max(1,N*NB), where NB is the optimal
-*> blocksize for ZHETRF.
+*> blocksize for ZHETRF_AA.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -154,7 +154,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEsolve
+*> \ingroup hesv_aa
*
* =====================================================================
SUBROUTINE ZHESV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
@@ -177,7 +177,7 @@ SUBROUTINE ZHESV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
*
* .. Local Scalars ..
LOGICAL LQUERY
- INTEGER LWKOPT, LWKOPT_HETRF, LWKOPT_HETRS
+ INTEGER LWKMIN, LWKOPT, LWKOPT_HETRF, LWKOPT_HETRS
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -196,6 +196,7 @@ SUBROUTINE ZHESV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
*
INFO = 0
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 2*N, 3*N-2 )
IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -206,17 +207,17 @@ SUBROUTINE ZHESV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
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
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -10
END IF
*
IF( INFO.EQ.0 ) THEN
CALL ZHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, -1, INFO )
- LWKOPT_HETRF = INT( WORK(1) )
+ LWKOPT_HETRF = INT( WORK( 1 ) )
CALL ZHETRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK,
$ -1, INFO )
- LWKOPT_HETRS = INT( WORK(1) )
- LWKOPT = MAX( LWKOPT_HETRF, LWKOPT_HETRS )
+ LWKOPT_HETRS = INT( WORK( 1 ) )
+ LWKOPT = MAX( LWKMIN, LWKOPT_HETRF, LWKOPT_HETRS )
WORK( 1 ) = LWKOPT
END IF
*
diff --git a/lapack-netlib/SRC/zhesv_aa_2stage.f b/lapack-netlib/SRC/zhesv_aa_2stage.f
index 79c01c546e..c503b5554d 100644
--- a/lapack-netlib/SRC/zhesv_aa_2stage.f
+++ b/lapack-netlib/SRC/zhesv_aa_2stage.f
@@ -100,14 +100,14 @@
*>
*> \param[out] TB
*> \verbatim
-*> TB is COMPLEX*16 array, dimension (LTB)
+*> TB is COMPLEX*16 array, dimension (MAX(1,LTB)).
*> On exit, details of the LU factorization of the band matrix.
*> \endverbatim
*>
*> \param[in] LTB
*> \verbatim
*> LTB is INTEGER
-*> The size of the array TB. LTB >= 4*N, internally
+*> The size of the array TB. LTB >= MAX(1,4*N), internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*> If LTB = -1, then a workspace query is assumed; the
@@ -147,14 +147,15 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX*16 workspace of size LWORK
+*> WORK is COMPLEX*16 workspace of size (MAX(1,LWORK)).
+*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The size of WORK. LWORK >= N, internally used to select NB
-*> such that LWORK >= N*NB.
+*> The size of WORK. LWORK >= MAX(1,N), internally used to
+*> select NB such that LWORK >= N*NB.
*>
*> If LWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal size of the WORK array,
@@ -178,7 +179,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEsolve
+*> \ingroup hesv_aa_2stage
*
* =====================================================================
SUBROUTINE ZHESV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
@@ -208,7 +209,7 @@ SUBROUTINE ZHESV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
*
* .. Local Scalars ..
LOGICAL UPPER, TQUERY, WQUERY
- INTEGER LWKOPT
+ INTEGER LWKOPT, LWKMIN
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -229,6 +230,7 @@ SUBROUTINE ZHESV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
UPPER = LSAME( UPLO, 'U' )
WQUERY = ( LWORK.EQ.-1 )
TQUERY = ( LTB.EQ.-1 )
+ LWKMIN = MAX( 1, N )
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -237,18 +239,19 @@ SUBROUTINE ZHESV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
INFO = -3
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -5
- ELSE IF( LTB.LT.( 4*N ) .AND. .NOT.TQUERY ) THEN
+ ELSE IF( LTB.LT.MAX( 1, 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
+ ELSE IF( LWORK.LT.LWKMIN .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) )
+ LWKOPT = MAX( LWKMIN, INT( WORK( 1 ) ) )
+ WORK( 1 ) = LWKOPT
END IF
*
IF( INFO.NE.0 ) THEN
diff --git a/lapack-netlib/SRC/zhesvx.f b/lapack-netlib/SRC/zhesvx.f
index 485c81df63..64aa166749 100644
--- a/lapack-netlib/SRC/zhesvx.f
+++ b/lapack-netlib/SRC/zhesvx.f
@@ -234,8 +234,8 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >= max(1,2*N), and for best
-*> performance, when FACT = 'N', LWORK >= max(1,2*N,N*NB), where
+*> The length of WORK. LWORK >= MAX(1,2*N), and for best
+*> performance, when FACT = 'N', LWORK >= MAX(1,2*N,N*NB), where
*> NB is the optimal blocksize for ZHETRF.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
@@ -276,7 +276,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEsolve
+*> \ingroup hesvx
*
* =====================================================================
SUBROUTINE ZHESVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
@@ -307,7 +307,7 @@ SUBROUTINE ZHESVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, NOFACT
- INTEGER LWKOPT, NB
+ INTEGER LWKOPT, LWKMIN, NB
DOUBLE PRECISION ANORM
* ..
* .. External Functions ..
@@ -329,6 +329,7 @@ SUBROUTINE ZHESVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
INFO = 0
NOFACT = LSAME( FACT, 'N' )
LQUERY = ( LWORK.EQ.-1 )
+ LWKMIN = MAX( 1, 2*N )
IF( .NOT.NOFACT .AND. .NOT.LSAME( FACT, 'F' ) ) THEN
INFO = -1
ELSE IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) )
@@ -346,12 +347,12 @@ SUBROUTINE ZHESVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
INFO = -11
ELSE IF( LDX.LT.MAX( 1, N ) ) THEN
INFO = -13
- ELSE IF( LWORK.LT.MAX( 1, 2*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -18
END IF
*
IF( INFO.EQ.0 ) THEN
- LWKOPT = MAX( 1, 2*N )
+ LWKOPT = LWKMIN
IF( NOFACT ) THEN
NB = ILAENV( 1, 'ZHETRF', UPLO, N, -1, -1, -1 )
LWKOPT = MAX( LWKOPT, N*NB )
diff --git a/lapack-netlib/SRC/zhetrd_2stage.f b/lapack-netlib/SRC/zhetrd_2stage.f
index b9d2f0eb19..ab444894b9 100644
--- a/lapack-netlib/SRC/zhetrd_2stage.f
+++ b/lapack-netlib/SRC/zhetrd_2stage.f
@@ -4,23 +4,23 @@
*
* =========== DOCUMENTATION ===========
*
-* Online html documentation available at
-* http://www.netlib.org/lapack/explore-html/
+* Online html documentation available at
+* http://www.netlib.org/lapack/explore-html/
*
*> \htmlonly
-*> Download ZHETRD_2STAGE + dependencies
-*>
-*> [TGZ]
-*>
-*> [ZIP]
-*>
+*> Download ZHETRD_2STAGE + dependencies
+*>
+*> [TGZ]
+*>
+*> [ZIP]
+*>
*> [TXT]
-*> \endhtmlonly
+*> \endhtmlonly
*
* Definition:
* ===========
*
-* SUBROUTINE ZHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
+* SUBROUTINE ZHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
* HOUS2, LHOUS2, WORK, LWORK, INFO )
*
* IMPLICIT NONE
@@ -34,7 +34,7 @@
* COMPLEX*16 A( LDA, * ), TAU( * ),
* HOUS2( * ), WORK( * )
* ..
-*
+*
*
*> \par Purpose:
* =============
@@ -52,11 +52,11 @@
*> \param[in] VECT
*> \verbatim
*> VECT is CHARACTER*1
-*> = 'N': No need for the Housholder representation,
+*> = 'N': No need for the Housholder representation,
*> in particular for the second stage (Band to
*> tridiagonal) and thus LHOUS2 is of size max(1, 4*N);
-*> = 'V': the Householder representation is needed to
-*> either generate Q1 Q2 or to apply Q1 Q2,
+*> = 'V': the Householder representation is needed to
+*> either generate Q1 Q2 or to apply Q1 Q2,
*> then LHOUS2 is to be queried and computed.
*> (NOT AVAILABLE IN THIS RELEASE).
*> \endverbatim
@@ -86,7 +86,7 @@
*> triangular part of A is not referenced.
*> On exit, if UPLO = 'U', the band superdiagonal
*> of A are overwritten by the corresponding elements of the
-*> internal band-diagonal matrix AB, and the elements above
+*> internal band-diagonal matrix AB, and the elements above
*> the KD superdiagonal, with the array TAU, represent the unitary
*> matrix Q1 as a product of elementary reflectors; if UPLO
*> = 'L', the diagonal and band subdiagonal of A are over-
@@ -117,13 +117,13 @@
*> \param[out] TAU
*> \verbatim
*> TAU is COMPLEX*16 array, dimension (N-KD)
-*> The scalar factors of the elementary reflectors of
+*> The scalar factors of the elementary reflectors of
*> the first stage (see Further Details).
*> \endverbatim
*>
*> \param[out] HOUS2
*> \verbatim
-*> HOUS2 is COMPLEX*16 array, dimension (LHOUS2)
+*> HOUS2 is COMPLEX*16 array, dimension (MAX(1,LHOUS2))
*> Stores the Householder representation of the stage2
*> band to tridiagonal.
*> \endverbatim
@@ -132,6 +132,8 @@
*> \verbatim
*> LHOUS2 is INTEGER
*> The dimension of the array HOUS2.
+*> LHOUS2 >= 1.
+*>
*> If LWORK = -1, or LHOUS2 = -1,
*> then a query is assumed; the routine
*> only calculates the optimal size of the HOUS2 array, returns
@@ -143,23 +145,26 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX*16 array, dimension (LWORK)
+*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK = MAX(1, dimension)
-*> If LWORK = -1, or LHOUS2=-1,
+*> The dimension of the array WORK.
+*> If N = 0, LWORK >= 1, else LWORK = MAX(1, dimension).
+*>
+*> If LWORK = -1, or LHOUS2 = -1,
*> then a workspace query is assumed; the routine
*> only 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 LWORK is issued by XERBLA.
*> LWORK = MAX(1, dimension) where
*> dimension = max(stage1,stage2) + (KD+1)*N
-*> = N*KD + N*max(KD+1,FACTOPTNB)
-*> + max(2*KD*KD, KD*NTHREADS)
-*> + (KD+1)*N
+*> = N*KD + N*max(KD+1,FACTOPTNB)
+*> + max(2*KD*KD, KD*NTHREADS)
+*> + (KD+1)*N
*> where KD is the blocking size of the reduction,
*> FACTOPTNB is the blocking used by the QR or LQ
*> algorithm, usually FACTOPTNB=128 is a good choice
@@ -177,12 +182,12 @@
* Authors:
* ========
*
-*> \author Univ. of Tennessee
-*> \author Univ. of California Berkeley
-*> \author Univ. of Colorado Denver
-*> \author NAG Ltd.
+*> \author Univ. of Tennessee
+*> \author Univ. of California Berkeley
+*> \author Univ. of Colorado Denver
+*> \author NAG Ltd.
*
-*> \ingroup complex16HEcomputational
+*> \ingroup hetrd_2stage
*
*> \par Further Details:
* =====================
@@ -202,7 +207,7 @@
*> http://doi.acm.org/10.1145/2063384.2063394
*>
*> A. Haidar, J. Kurzak, P. Luszczek, 2013.
-*> An improved parallel singular value algorithm and its implementation
+*> An improved parallel singular value algorithm and its implementation
*> for multicore hardware, In Proceedings of 2013 International Conference
*> for High Performance Computing, Networking, Storage and Analysis (SC '13).
*> Denver, Colorado, USA, 2013.
@@ -210,16 +215,16 @@
*> http://doi.acm.org/10.1145/2503210.2503292
*>
*> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
-*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
+*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
*> calculations based on fine-grained memory aware tasks.
*> International Journal of High Performance Computing Applications.
*> Volume 28 Issue 2, Pages 196-209, May 2014.
-*> http://hpc.sagepub.com/content/28/2/196
+*> http://hpc.sagepub.com/content/28/2/196
*>
*> \endverbatim
*>
* =====================================================================
- SUBROUTINE ZHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
+ SUBROUTINE ZHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
$ HOUS2, LHOUS2, WORK, LWORK, INFO )
*
IMPLICIT NONE
@@ -265,10 +270,13 @@ SUBROUTINE ZHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
*
KD = ILAENV2STAGE( 1, 'ZHETRD_2STAGE', VECT, N, -1, -1, -1 )
IB = ILAENV2STAGE( 2, 'ZHETRD_2STAGE', VECT, N, KD, -1, -1 )
- LHMIN = ILAENV2STAGE( 3, 'ZHETRD_2STAGE', VECT, N, KD, IB, -1 )
- LWMIN = ILAENV2STAGE( 4, 'ZHETRD_2STAGE', VECT, N, KD, IB, -1 )
-* WRITE(*,*),'ZHETRD_2STAGE N KD UPLO LHMIN LWMIN ',N, KD, UPLO,
-* $ LHMIN, LWMIN
+ IF( N.EQ.0 ) THEN
+ LHMIN = 1
+ LWMIN = 1
+ ELSE
+ LHMIN = ILAENV2STAGE( 3, 'ZHETRD_2STAGE', VECT, N, KD, IB, -1 )
+ LWMIN = ILAENV2STAGE( 4, 'ZHETRD_2STAGE', VECT, N, KD, IB, -1 )
+ END IF
*
IF( .NOT.LSAME( VECT, 'N' ) ) THEN
INFO = -1
@@ -309,14 +317,14 @@ SUBROUTINE ZHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
LWRK = LWORK-LDAB*N
ABPOS = 1
WPOS = ABPOS + LDAB*N
- CALL ZHETRD_HE2HB( UPLO, N, KD, A, LDA, WORK( ABPOS ), LDAB,
+ CALL ZHETRD_HE2HB( UPLO, N, KD, A, LDA, WORK( ABPOS ), LDAB,
$ TAU, WORK( WPOS ), LWRK, INFO )
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'ZHETRD_HE2HB', -INFO )
RETURN
END IF
- CALL ZHETRD_HB2ST( 'Y', VECT, UPLO, N, KD,
- $ WORK( ABPOS ), LDAB, D, E,
+ CALL ZHETRD_HB2ST( 'Y', VECT, UPLO, N, KD,
+ $ WORK( ABPOS ), LDAB, D, E,
$ HOUS2, LHOUS2, WORK( WPOS ), LWRK, INFO )
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'ZHETRD_HB2ST', -INFO )
@@ -324,7 +332,6 @@ SUBROUTINE ZHETRD_2STAGE( VECT, UPLO, N, A, LDA, D, E, TAU,
END IF
*
*
- HOUS2( 1 ) = LHMIN
WORK( 1 ) = LWMIN
RETURN
*
diff --git a/lapack-netlib/SRC/zhetrd_hb2st.F b/lapack-netlib/SRC/zhetrd_hb2st.F
index 1d39ac9428..247497ab67 100644
--- a/lapack-netlib/SRC/zhetrd_hb2st.F
+++ b/lapack-netlib/SRC/zhetrd_hb2st.F
@@ -18,7 +18,7 @@
* Definition:
* ===========
*
-* SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
+* SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
* D, E, HOUS, LHOUS, WORK, LWORK, INFO )
*
* #if defined(_OPENMP)
@@ -53,12 +53,12 @@
*> \param[in] STAGE1
*> \verbatim
*> STAGE1 is CHARACTER*1
-*> = 'N': "No": to mention that the stage 1 of the reduction
+*> = 'N': "No": to mention that the stage 1 of the reduction
*> from dense to band using the zhetrd_he2hb routine
-*> was not called before this routine to reproduce AB.
-*> In other term this routine is called as standalone.
-*> = 'Y': "Yes": to mention that the stage 1 of the
-*> reduction from dense to band using the zhetrd_he2hb
+*> was not called before this routine to reproduce AB.
+*> In other term this routine is called as standalone.
+*> = 'Y': "Yes": to mention that the stage 1 of the
+*> reduction from dense to band using the zhetrd_he2hb
*> routine has been called to produce AB (e.g., AB is
*> the output of zhetrd_he2hb.
*> \endverbatim
@@ -66,10 +66,10 @@
*> \param[in] VECT
*> \verbatim
*> VECT is CHARACTER*1
-*> = 'N': No need for the Housholder representation,
+*> = 'N': No need for the Housholder representation,
*> and thus LHOUS is of size max(1, 4*N);
-*> = 'V': the Householder representation is needed to
-*> either generate or to apply Q later on,
+*> = 'V': the Householder representation is needed to
+*> either generate or to apply Q later on,
*> then LHOUS is to be queried and computed.
*> (NOT AVAILABLE IN THIS RELEASE).
*> \endverbatim
@@ -132,34 +132,39 @@
*>
*> \param[out] HOUS
*> \verbatim
-*> HOUS is COMPLEX*16 array, dimension LHOUS, that
-*> store the Householder representation.
+*> HOUS is COMPLEX*16 array, dimension (MAX(1,LHOUS))
+*> Stores the Householder representation.
*> \endverbatim
*>
*> \param[in] LHOUS
*> \verbatim
*> LHOUS is INTEGER
-*> The dimension of the array HOUS. LHOUS = MAX(1, dimension)
-*> If LWORK = -1, or LHOUS=-1,
+*> The dimension of the array HOUS.
+*> If N = 0 or KD <= 1, LHOUS >= 1, else LHOUS = MAX(1, dimension).
+*>
+*> If LWORK = -1, or LHOUS = -1,
*> then a query is assumed; the routine
*> only calculates the optimal size of the HOUS array, returns
*> this value as the first entry of the HOUS array, and no error
*> message related to LHOUS is issued by XERBLA.
*> LHOUS = MAX(1, dimension) where
*> dimension = 4*N if VECT='N'
-*> not available now if VECT='H'
+*> not available now if VECT='H'
*> \endverbatim
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX*16 array, dimension LWORK.
+*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)).
+*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK = MAX(1, dimension)
-*> If LWORK = -1, or LHOUS=-1,
+*> The dimension of the array WORK.
+*> If N = 0 or KD <= 1, LWORK >= 1, else LWORK = MAX(1, dimension).
+*>
+*> If LWORK = -1, or LHOUS = -1,
*> then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
@@ -188,7 +193,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16OTHERcomputational
+*> \ingroup hetrd_hb2st
*
*> \par Further Details:
* =====================
@@ -208,7 +213,7 @@
*> http://doi.acm.org/10.1145/2063384.2063394
*>
*> A. Haidar, J. Kurzak, P. Luszczek, 2013.
-*> An improved parallel singular value algorithm and its implementation
+*> An improved parallel singular value algorithm and its implementation
*> for multicore hardware, In Proceedings of 2013 International Conference
*> for High Performance Computing, Networking, Storage and Analysis (SC '13).
*> Denver, Colorado, USA, 2013.
@@ -216,16 +221,16 @@
*> http://doi.acm.org/10.1145/2503210.2503292
*>
*> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
-*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
+*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
*> calculations based on fine-grained memory aware tasks.
*> International Journal of High Performance Computing Applications.
*> Volume 28 Issue 2, Pages 196-209, May 2014.
-*> http://hpc.sagepub.com/content/28/2/196
+*> http://hpc.sagepub.com/content/28/2/196
*>
*> \endverbatim
*>
* =====================================================================
- SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
+ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
$ D, E, HOUS, LHOUS, WORK, LWORK, INFO )
*
*
@@ -259,11 +264,11 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, WANTQ, UPPER, AFTERS1
- INTEGER I, M, K, IB, SWEEPID, MYID, SHIFT, STT, ST,
+ INTEGER I, M, K, IB, SWEEPID, MYID, SHIFT, STT, ST,
$ ED, STIND, EDIND, BLKLASTIND, COLPT, THED,
$ STEPERCOL, GRSIZ, THGRSIZ, THGRNB, THGRID,
- $ NBTILES, TTYPE, TID, NTHREADS, DEBUG,
- $ ABDPOS, ABOFDPOS, DPOS, OFDPOS, AWPOS,
+ $ NBTILES, TTYPE, TID, NTHREADS,
+ $ ABDPOS, ABOFDPOS, DPOS, OFDPOS, AWPOS,
$ INDA, INDW, APOS, SIZEA, LDA, INDV, INDTAU,
$ SIZEV, SIZETAU, LDV, LHMIN, LWMIN
DOUBLE PRECISION ABSTMP
@@ -277,7 +282,7 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
* ..
* .. External Functions ..
LOGICAL LSAME
- INTEGER ILAENV2STAGE
+ INTEGER ILAENV2STAGE
EXTERNAL LSAME, ILAENV2STAGE
* ..
* .. Executable Statements ..
@@ -285,7 +290,6 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
* Determine the minimal workspace size required.
* Test the input parameters
*
- DEBUG = 0
INFO = 0
AFTERS1 = LSAME( STAGE1, 'Y' )
WANTQ = LSAME( VECT, 'V' )
@@ -294,9 +298,14 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
*
* Determine the block size, the workspace size and the hous size.
*
- IB = ILAENV2STAGE( 2, 'ZHETRD_HB2ST', VECT, N, KD, -1, -1 )
- LHMIN = ILAENV2STAGE( 3, 'ZHETRD_HB2ST', VECT, N, KD, IB, -1 )
- LWMIN = ILAENV2STAGE( 4, 'ZHETRD_HB2ST', VECT, N, KD, IB, -1 )
+ IB = ILAENV2STAGE( 2, 'ZHETRD_HB2ST', VECT, N, KD, -1, -1 )
+ IF( N.EQ.0 .OR. KD.LE.1 ) THEN
+ LHMIN = 1
+ LWMIN = 1
+ ELSE
+ LHMIN = ILAENV2STAGE( 3, 'ZHETRD_HB2ST', VECT, N, KD, IB, -1 )
+ LWMIN = ILAENV2STAGE( 4, 'ZHETRD_HB2ST', VECT, N, KD, IB, -1 )
+ END IF
*
IF( .NOT.AFTERS1 .AND. .NOT.LSAME( STAGE1, 'N' ) ) THEN
INFO = -1
@@ -358,7 +367,7 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
ABDPOS = KD + 1
ABOFDPOS = KD
ELSE
- APOS = INDA
+ APOS = INDA
AWPOS = INDA + KD + 1
DPOS = APOS
OFDPOS = DPOS + 1
@@ -366,11 +375,11 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
ABOFDPOS = 2
ENDIF
-*
-* Case KD=0:
-* The matrix is diagonal. We just copy it (convert to "real" for
-* complex because D is double and the imaginary part should be 0)
-* and store it in D. A sequential code here is better or
+*
+* Case KD=0:
+* The matrix is diagonal. We just copy it (convert to "real" for
+* complex because D is double and the imaginary part should be 0)
+* and store it in D. A sequential code here is better or
* in a parallel environment it might need two cores for D and E
*
IF( KD.EQ.0 ) THEN
@@ -385,17 +394,17 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
WORK( 1 ) = 1
RETURN
END IF
-*
-* Case KD=1:
-* The matrix is already Tridiagonal. We have to make diagonal
+*
+* Case KD=1:
+* The matrix is already Tridiagonal. We have to make diagonal
* and offdiagonal elements real, and store them in D and E.
-* For that, for real precision just copy the diag and offdiag
-* to D and E while for the COMPLEX case the bulge chasing is
-* performed to convert the hermetian tridiagonal to symmetric
-* tridiagonal. A simpler conversion formula might be used, but then
+* For that, for real precision just copy the diag and offdiag
+* to D and E while for the COMPLEX case the bulge chasing is
+* performed to convert the hermetian tridiagonal to symmetric
+* tridiagonal. A simpler conversion formula might be used, but then
* updating the Q matrix will be required and based if Q is generated
-* or not this might complicate the story.
-*
+* or not this might complicate the story.
+*
IF( KD.EQ.1 ) THEN
DO 50 I = 1, N
D( I ) = DBLE( AB( ABDPOS, I ) )
@@ -444,7 +453,7 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
RETURN
END IF
*
-* Main code start here.
+* Main code start here.
* Reduce the hermitian band of A to a tridiagonal matrix.
*
THGRSIZ = N
@@ -453,7 +462,7 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
NBTILES = CEILING( REAL(N)/REAL(KD) )
STEPERCOL = CEILING( REAL(SHIFT)/REAL(GRSIZ) )
THGRNB = CEILING( REAL(N-1)/REAL(THGRSIZ) )
-*
+*
CALL ZLACPY( "A", KD+1, N, AB, LDAB, WORK( APOS ), LDA )
CALL ZLASET( "A", KD, N, ZERO, ZERO, WORK( AWPOS ), LDA )
*
@@ -462,7 +471,7 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
*
#if defined(_OPENMP)
!$OMP PARALLEL PRIVATE( TID, THGRID, BLKLASTIND )
-!$OMP$ PRIVATE( THED, I, M, K, ST, ED, STT, SWEEPID )
+!$OMP$ PRIVATE( THED, I, M, K, ST, ED, STT, SWEEPID )
!$OMP$ PRIVATE( MYID, TTYPE, COLPT, STIND, EDIND )
!$OMP$ SHARED ( UPLO, WANTQ, INDV, INDTAU, HOUS, WORK)
!$OMP$ SHARED ( N, KD, IB, NBTILES, LDA, LDV, INDA )
@@ -471,7 +480,7 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
#endif
*
* main bulge chasing loop
-*
+*
DO 100 THGRID = 1, THGRNB
STT = (THGRID-1)*THGRSIZ+1
THED = MIN( (STT + THGRSIZ -1), (N-1))
@@ -482,7 +491,7 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
ST = STT
DO 130 SWEEPID = ST, ED
DO 140 K = 1, GRSIZ
- MYID = (I-SWEEPID)*(STEPERCOL*GRSIZ)
+ MYID = (I-SWEEPID)*(STEPERCOL*GRSIZ)
$ + (M-1)*GRSIZ + K
IF ( MYID.EQ.1 ) THEN
TTYPE = 1
@@ -508,17 +517,17 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
ENDIF
*
* Call the kernel
-*
+*
#if defined(_OPENMP) && _OPENMP >= 201307
- IF( TTYPE.NE.1 ) THEN
+ IF( TTYPE.NE.1 ) THEN
!$OMP TASK DEPEND(in:WORK(MYID+SHIFT-1))
!$OMP$ DEPEND(in:WORK(MYID-1))
!$OMP$ DEPEND(out:WORK(MYID))
TID = OMP_GET_THREAD_NUM()
- CALL ZHB2ST_KERNELS( UPLO, WANTQ, TTYPE,
+ CALL ZHB2ST_KERNELS( UPLO, WANTQ, TTYPE,
$ STIND, EDIND, SWEEPID, N, KD, IB,
- $ WORK ( INDA ), LDA,
+ $ WORK ( INDA ), LDA,
$ HOUS( INDV ), HOUS( INDTAU ), LDV,
$ WORK( INDW + TID*KD ) )
!$OMP END TASK
@@ -526,20 +535,20 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
!$OMP TASK DEPEND(in:WORK(MYID+SHIFT-1))
!$OMP$ DEPEND(out:WORK(MYID))
TID = OMP_GET_THREAD_NUM()
- CALL ZHB2ST_KERNELS( UPLO, WANTQ, TTYPE,
+ CALL ZHB2ST_KERNELS( UPLO, WANTQ, TTYPE,
$ STIND, EDIND, SWEEPID, N, KD, IB,
- $ WORK ( INDA ), LDA,
+ $ WORK ( INDA ), LDA,
$ HOUS( INDV ), HOUS( INDTAU ), LDV,
$ WORK( INDW + TID*KD ) )
!$OMP END TASK
ENDIF
#else
- CALL ZHB2ST_KERNELS( UPLO, WANTQ, TTYPE,
+ CALL ZHB2ST_KERNELS( UPLO, WANTQ, TTYPE,
$ STIND, EDIND, SWEEPID, N, KD, IB,
- $ WORK ( INDA ), LDA,
+ $ WORK ( INDA ), LDA,
$ HOUS( INDV ), HOUS( INDTAU ), LDV,
$ WORK( INDW ) )
-#endif
+#endif
IF ( BLKLASTIND.GE.(N-1) ) THEN
STT = STT + 1
EXIT
@@ -554,14 +563,14 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
!$OMP END MASTER
!$OMP END PARALLEL
#endif
-*
+*
* Copy the diagonal from A to D. Note that D is REAL thus only
* the Real part is needed, the imaginary part should be zero.
*
DO 150 I = 1, N
D( I ) = DBLE( WORK( DPOS+(I-1)*LDA ) )
150 CONTINUE
-*
+*
* Copy the off diagonal from A to E. Note that E is REAL thus only
* the Real part is needed, the imaginary part should be zero.
*
@@ -575,11 +584,10 @@ SUBROUTINE ZHETRD_HB2ST( STAGE1, VECT, UPLO, N, KD, AB, LDAB,
170 CONTINUE
ENDIF
*
- HOUS( 1 ) = LHMIN
WORK( 1 ) = LWMIN
RETURN
*
* End of ZHETRD_HB2ST
*
END
-
+
diff --git a/lapack-netlib/SRC/zhetrd_he2hb.f b/lapack-netlib/SRC/zhetrd_he2hb.f
index e1b2e17948..3e3bfa374c 100644
--- a/lapack-netlib/SRC/zhetrd_he2hb.f
+++ b/lapack-netlib/SRC/zhetrd_he2hb.f
@@ -123,8 +123,8 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX*16 array, dimension (LWORK)
-*> On exit, if INFO = 0, or if LWORK=-1,
+*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, or if LWORK = -1,
*> WORK(1) returns the size of LWORK.
*> \endverbatim
*>
@@ -132,7 +132,9 @@
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK which should be calculated
-*> by a workspace query. LWORK = MAX(1, LWORK_QUERY)
+*> by a workspace query.
+*> If N <= KD+1, LWORK >= 1, else LWORK = MAX(1, LWORK_QUERY).
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
@@ -158,7 +160,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEcomputational
+*> \ingroup hetrd_he2hb
*
*> \par Further Details:
* =====================
@@ -293,8 +295,12 @@ SUBROUTINE ZHETRD_HE2HB( UPLO, N, KD, A, LDA, AB, LDAB, TAU,
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
- LWMIN = ILAENV2STAGE( 4, 'ZHETRD_HE2HB', '', N, KD, -1, -1 )
-
+ IF( N.LE.KD+1 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = ILAENV2STAGE( 4, 'ZHETRD_HE2HB', '', N, KD, -1, -1 )
+ END IF
+*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
diff --git a/lapack-netlib/SRC/zhetrf.f b/lapack-netlib/SRC/zhetrf.f
index 78d4f71b89..433887108b 100644
--- a/lapack-netlib/SRC/zhetrf.f
+++ b/lapack-netlib/SRC/zhetrf.f
@@ -107,7 +107,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >=1. For best performance
+*> The length of WORK. LWORK >= 1. For best performance
*> LWORK >= N*NB, where NB is the block size returned by ILAENV.
*> \endverbatim
*>
@@ -130,7 +130,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEcomputational
+*> \ingroup hetrf
*
*> \par Further Details:
* =====================
@@ -227,7 +227,7 @@ SUBROUTINE ZHETRF( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
* Determine the block size
*
NB = ILAENV( 1, 'ZHETRF', UPLO, N, -1, -1, -1 )
- LWKOPT = N*NB
+ LWKOPT = MAX( 1, N*NB )
WORK( 1 ) = LWKOPT
END IF
*
@@ -346,6 +346,7 @@ SUBROUTINE ZHETRF( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
END IF
*
40 CONTINUE
+*
WORK( 1 ) = LWKOPT
RETURN
*
diff --git a/lapack-netlib/SRC/zhetrf_aa.f b/lapack-netlib/SRC/zhetrf_aa.f
index 537c16e8cd..381c87d51c 100644
--- a/lapack-netlib/SRC/zhetrf_aa.f
+++ b/lapack-netlib/SRC/zhetrf_aa.f
@@ -101,8 +101,10 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >= MAX(1,2*N). For optimum performance
-*> LWORK >= N*(1+NB), where NB is the optimal blocksize.
+*> The length of WORK.
+*> LWORK >= 1, if N >= 1, and LWORK >= 2*N, otherwise.
+*> For optimum performance LWORK >= N*(1+NB), where NB is
+*> the optimal blocksize, returned by ILAENV.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
*> only calculates the optimal size of the WORK array, returns
@@ -125,10 +127,10 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEcomputational
+*> \ingroup hetrf_aa
*
* =====================================================================
- SUBROUTINE ZHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
+ SUBROUTINE ZHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
@@ -152,7 +154,7 @@ SUBROUTINE ZHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
*
* .. Local Scalars ..
LOGICAL LQUERY, UPPER
- INTEGER J, LWKOPT
+ INTEGER J, LWKMIN, LWKOPT
INTEGER NB, MJ, NJ, K1, K2, J1, J2, J3, JB
COMPLEX*16 ALPHA
* ..
@@ -178,18 +180,25 @@ SUBROUTINE ZHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
+ IF( N.LE.1 ) THEN
+ LWKMIN = 1
+ LWKOPT = 1
+ ELSE
+ LWKMIN = 2*N
+ LWKOPT = (NB+1)*N
+ END IF
+*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF( LWORK.LT.MAX( 1, 2*N ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -7
END IF
*
IF( INFO.EQ.0 ) THEN
- LWKOPT = (NB+1)*N
WORK( 1 ) = LWKOPT
END IF
*
@@ -202,11 +211,11 @@ SUBROUTINE ZHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
*
* Quick return
*
- IF ( N.EQ.0 ) THEN
+ IF( N.EQ.0 ) THEN
RETURN
ENDIF
IPIV( 1 ) = 1
- IF ( N.EQ.1 ) THEN
+ IF( N.EQ.1 ) THEN
A( 1, 1 ) = DBLE( A( 1, 1 ) )
RETURN
END IF
diff --git a/lapack-netlib/SRC/zhetrf_aa_2stage.f b/lapack-netlib/SRC/zhetrf_aa_2stage.f
index 477602b5e6..bab13a99d8 100644
--- a/lapack-netlib/SRC/zhetrf_aa_2stage.f
+++ b/lapack-netlib/SRC/zhetrf_aa_2stage.f
@@ -87,14 +87,14 @@
*>
*> \param[out] TB
*> \verbatim
-*> TB is COMPLEX*16 array, dimension (LTB)
+*> TB is COMPLEX*16 array, dimension (MAX(1,LTB))
*> On exit, details of the LU factorization of the band matrix.
*> \endverbatim
*>
*> \param[in] LTB
*> \verbatim
*> LTB is INTEGER
-*> The size of the array TB. LTB >= 4*N, internally
+*> The size of the array TB. LTB >= MAX(1,4*N), internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*> If LTB = -1, then a workspace query is assumed; the
@@ -121,14 +121,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX*16 workspace of size LWORK
+*> WORK is COMPLEX*16 workspace of size (MAX(1,LWORK))
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The size of WORK. LWORK >= N, internally used to select NB
-*> such that LWORK >= N*NB.
+*> The size of WORK. LWORK >= MAX(1,N), internally used to
+*> select NB such that LWORK >= N*NB.
*>
*> If LWORK = -1, then a workspace query is assumed; the
*> routine only calculates the optimal size of the WORK array,
@@ -152,7 +152,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16SYcomputational
+*> \ingroup hetrf_aa_2stage
*
* =====================================================================
SUBROUTINE ZHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
@@ -182,7 +182,7 @@ SUBROUTINE ZHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
* .. Local Scalars ..
LOGICAL UPPER, TQUERY, WQUERY
INTEGER I, J, K, I1, I2, TD
- INTEGER LDTB, NB, KB, JB, NT, IINFO
+ INTEGER LWKOPT, LDTB, NB, KB, JB, NT, IINFO
COMPLEX*16 PIV
* ..
* .. External Functions ..
@@ -212,9 +212,9 @@ SUBROUTINE ZHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF ( LTB .LT. 4*N .AND. .NOT.TQUERY ) THEN
+ ELSE IF( LTB.LT.MAX( 1, 4*N ) .AND. .NOT.TQUERY ) THEN
INFO = -6
- ELSE IF ( LWORK .LT. N .AND. .NOT.WQUERY ) THEN
+ ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.WQUERY ) THEN
INFO = -10
END IF
*
@@ -228,10 +228,10 @@ SUBROUTINE ZHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
NB = ILAENV( 1, 'ZHETRF_AA_2STAGE', UPLO, N, -1, -1, -1 )
IF( INFO.EQ.0 ) THEN
IF( TQUERY ) THEN
- TB( 1 ) = (3*NB+1)*N
+ TB( 1 ) = MAX( 1, (3*NB+1)*N )
END IF
IF( WQUERY ) THEN
- WORK( 1 ) = N*NB
+ WORK( 1 ) = MAX( 1, N*NB )
END IF
END IF
IF( TQUERY .OR. WQUERY ) THEN
@@ -240,7 +240,7 @@ SUBROUTINE ZHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
*
* Quick return
*
- IF ( N.EQ.0 ) THEN
+ IF( N.EQ.0 ) THEN
RETURN
ENDIF
*
@@ -392,7 +392,7 @@ SUBROUTINE ZHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
CALL ZGETRF( N-(J+1)*NB, NB,
$ WORK, N,
$ IPIV( (J+1)*NB+1 ), IINFO )
-c IF (IINFO.NE.0 .AND. INFO.EQ.0) THEN
+c IF( IINFO.NE.0 .AND. INFO.EQ.0 ) THEN
c INFO = IINFO+(J+1)*NB
c END IF
*
@@ -587,7 +587,7 @@ SUBROUTINE ZHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV,
CALL ZGETRF( N-(J+1)*NB, NB,
$ A( (J+1)*NB+1, J*NB+1 ), LDA,
$ IPIV( (J+1)*NB+1 ), IINFO )
-c IF (IINFO.NE.0 .AND. INFO.EQ.0) THEN
+c IF( IINFO.NE.0 .AND. INFO.EQ.0 ) THEN
c INFO = IINFO+(J+1)*NB
c END IF
*
diff --git a/lapack-netlib/SRC/zhetrf_rk.f b/lapack-netlib/SRC/zhetrf_rk.f
index 73dd9f9d07..7c505fa4de 100644
--- a/lapack-netlib/SRC/zhetrf_rk.f
+++ b/lapack-netlib/SRC/zhetrf_rk.f
@@ -177,14 +177,14 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX*16 array, dimension ( MAX(1,LWORK) ).
+*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)).
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >=1. For best performance
+*> The length of WORK. LWORK >= 1. For best performance
*> LWORK >= N*NB, where NB is the block size returned
*> by ILAENV.
*>
@@ -229,7 +229,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEcomputational
+*> \ingroup hetrf_rk
*
*> \par Further Details:
* =====================
@@ -310,7 +310,7 @@ SUBROUTINE ZHETRF_RK( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
* Determine the block size
*
NB = ILAENV( 1, 'ZHETRF_RK', UPLO, N, -1, -1, -1 )
- LWKOPT = N*NB
+ LWKOPT = MAX( 1, N*NB )
WORK( 1 ) = LWKOPT
END IF
*
diff --git a/lapack-netlib/SRC/zhetrf_rook.f b/lapack-netlib/SRC/zhetrf_rook.f
index e9de472486..a563490927 100644
--- a/lapack-netlib/SRC/zhetrf_rook.f
+++ b/lapack-netlib/SRC/zhetrf_rook.f
@@ -122,7 +122,7 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The length of WORK. LWORK >=1. For best performance
+*> The length of WORK. LWORK >= 1. For best performance
*> LWORK >= N*NB, where NB is the block size returned by ILAENV.
*>
*> If LWORK = -1, then a workspace query is assumed; the routine
@@ -150,7 +150,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEcomputational
+*> \ingroup hetrf_rook
*
*> \par Further Details:
* =====================
diff --git a/lapack-netlib/SRC/zhetri2.f b/lapack-netlib/SRC/zhetri2.f
index 384745c3af..1d932b866c 100644
--- a/lapack-netlib/SRC/zhetri2.f
+++ b/lapack-netlib/SRC/zhetri2.f
@@ -88,16 +88,16 @@
*>
*> \param[out] WORK
*> \verbatim
-*> WORK is COMPLEX*16 array, dimension (N+NB+1)*(NB+3)
+*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)).
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*> WORK is size >= (N+NB+1)*(NB+3)
+*> If N = 0, LWORK >= 1, else LWORK >= (N+NB+1)*(NB+3).
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> calculates:
+*> 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 LWORK is issued by XERBLA.
@@ -120,7 +120,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEcomputational
+*> \ingroup hetri2
*
* =====================================================================
SUBROUTINE ZHETRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
@@ -159,9 +159,13 @@ SUBROUTINE ZHETRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
+*
* Get blocksize
+*
NBMAX = ILAENV( 1, 'ZHETRF', UPLO, N, -1, -1, -1 )
- IF ( NBMAX .GE. N ) THEN
+ IF( N.EQ.0 ) THEN
+ MINSIZE = 1
+ ELSE IF( NBMAX.GE.N ) THEN
MINSIZE = N
ELSE
MINSIZE = (N+NBMAX+1)*(NBMAX+3)
@@ -173,28 +177,29 @@ SUBROUTINE ZHETRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
- ELSE IF (LWORK .LT. MINSIZE .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.MINSIZE .AND. .NOT.LQUERY ) THEN
INFO = -7
END IF
-*
-* Quick return if possible
-*
*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'ZHETRI2', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- WORK(1)=MINSIZE
+ WORK( 1 ) = MINSIZE
RETURN
END IF
+*
+* Quick return if possible
+*
IF( N.EQ.0 )
$ RETURN
- IF( NBMAX .GE. N ) THEN
+ IF( NBMAX.GE.N ) THEN
CALL ZHETRI( UPLO, N, A, LDA, IPIV, WORK, INFO )
ELSE
CALL ZHETRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO )
END IF
+*
RETURN
*
* End of ZHETRI2
diff --git a/lapack-netlib/SRC/zhetrs_aa.f b/lapack-netlib/SRC/zhetrs_aa.f
index 06ac1fd287..b7a1f7f07b 100644
--- a/lapack-netlib/SRC/zhetrs_aa.f
+++ b/lapack-netlib/SRC/zhetrs_aa.f
@@ -106,7 +106,13 @@
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= max(1,3*N-2).
+*> The dimension of the array WORK.
+*> If MIN(N,NRHS) = 0, LWORK >= 1, else LWORK >= 3*N-2.
+*>
+*> If LWORK = -1, then a workspace query is assumed; the routine
+*> only calculates the minimal size of the WORK array, returns
+*> this value as the first entry of the WORK array, and no error
+*> message related to LWORK is issued by XERBLA.
*> \endverbatim
*>
*> \param[out] INFO
@@ -124,7 +130,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup complex16HEcomputational
+*> \ingroup hetrs_aa
*
* =====================================================================
SUBROUTINE ZHETRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
@@ -152,7 +158,7 @@ SUBROUTINE ZHETRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
* ..
* .. Local Scalars ..
LOGICAL LQUERY, UPPER
- INTEGER K, KP, LWKOPT
+ INTEGER K, KP, LWKMIN
* ..
* .. External Functions ..
LOGICAL LSAME
@@ -162,13 +168,19 @@ SUBROUTINE ZHETRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
EXTERNAL ZGTSV, ZSWAP, ZTRSM, ZLACGV, ZLACPY, XERBLA
* ..
* .. Intrinsic Functions ..
- INTRINSIC MAX
+ INTRINSIC MIN, MAX
* ..
* .. Executable Statements ..
*
INFO = 0
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
+ IF( MIN( N, NRHS ).EQ.0 ) THEN
+ LWKMIN = 1
+ ELSE
+ LWKMIN = 3*N-2
+ END IF
+*
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
INFO = -1
ELSE IF( N.LT.0 ) THEN
@@ -179,21 +191,20 @@ SUBROUTINE ZHETRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
INFO = -5
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -8
- ELSE IF( LWORK.LT.MAX( 1, 3*N-2 ) .AND. .NOT.LQUERY ) THEN
+ ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
INFO = -10
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'ZHETRS_AA', -INFO )
RETURN
ELSE IF( LQUERY ) THEN
- LWKOPT = (3*N-2)
- WORK( 1 ) = LWKOPT
+ WORK( 1 ) = LWKMIN
RETURN
END IF
*
* Quick return if possible
*
- IF( N.EQ.0 .OR. NRHS.EQ.0 )
+ IF( MIN( N, NRHS ).EQ.0 )
$ RETURN
*
IF( UPPER ) THEN
diff --git a/lapack-netlib/SRC/zlamswlq.f b/lapack-netlib/SRC/zlamswlq.f
index 4abefa4343..59a0a55581 100644
--- a/lapack-netlib/SRC/zlamswlq.f
+++ b/lapack-netlib/SRC/zlamswlq.f
@@ -127,17 +127,20 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
+*> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
-*> If SIDE = 'L', LWORK >= max(1,NB) * MB;
-*> if SIDE = 'R', LWORK >= max(1,M) * MB.
+*> If MIN(M,N,K) = 0, LWORK >= 1.
+*> If SIDE = 'L', LWORK >= max(1,NB*MB).
+*> If SIDE = 'R', LWORK >= max(1,M*MB).
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
*> \endverbatim
@@ -189,92 +192,103 @@
*> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
*> \endverbatim
*>
+*> \ingroup lamswlq
+*>
* =====================================================================
SUBROUTINE ZLAMSWLQ( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
- $ LDT, C, LDC, WORK, LWORK, INFO )
+ $ LDT, C, LDC, WORK, LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*
* .. Scalar Arguments ..
- CHARACTER SIDE, TRANS
- INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
+ CHARACTER SIDE, TRANS
+ INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
* ..
* .. Array Arguments ..
- COMPLEX*16 A( LDA, * ), WORK( * ), C(LDC, * ),
- $ T( LDT, * )
+ COMPLEX*16 A( LDA, * ), WORK( * ), C( LDC, * ),
+ $ T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER I, II, KK, LW, CTR
+ LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
+ INTEGER I, II, KK, LW, CTR, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
EXTERNAL LSAME
+* ..
* .. External Subroutines ..
- EXTERNAL ZTPMLQT, ZGEMLQT, XERBLA
+ EXTERNAL ZTPMLQT, ZGEMLQT, XERBLA
* ..
* .. Executable Statements ..
*
* Test the input arguments
*
- LQUERY = LWORK.LT.0
+ INFO = 0
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'C' )
LEFT = LSAME( SIDE, 'L' )
RIGHT = LSAME( SIDE, 'R' )
- IF (LEFT) THEN
+ IF( LEFT ) THEN
LW = N * MB
ELSE
LW = M * MB
END IF
*
- INFO = 0
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
+*
IF( .NOT.LEFT .AND. .NOT.RIGHT ) THEN
- INFO = -1
+ INFO = -1
ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN
- INFO = -2
+ INFO = -2
ELSE IF( K.LT.0 ) THEN
INFO = -5
ELSE IF( M.LT.K ) THEN
INFO = -3
ELSE IF( N.LT.0 ) THEN
INFO = -4
- ELSE IF( K.LT.MB .OR. MB.LT.1) THEN
+ ELSE IF( K.LT.MB .OR. MB.LT.1 ) THEN
INFO = -6
ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
INFO = -9
- ELSE IF( LDT.LT.MAX( 1, MB) ) THEN
+ ELSE IF( LDT.LT.MAX( 1, MB ) ) THEN
INFO = -11
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
- INFO = -13
- ELSE IF(( LWORK.LT.MAX(1,LW)).AND.(.NOT.LQUERY)) THEN
+ INFO = -13
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -15
END IF
*
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = LWMIN
+ END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'ZLAMSWLQ', -INFO )
- WORK(1) = LW
RETURN
- ELSE IF (LQUERY) THEN
- WORK(1) = LW
+ ELSE IF( LQUERY ) THEN
RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N,K).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
*
IF((NB.LE.K).OR.(NB.GE.MAX(M,N,K))) THEN
CALL ZGEMLQT( SIDE, TRANS, M, N, K, MB, A, LDA,
- $ T, LDT, C, LDC, WORK, INFO)
+ $ T, LDT, C, LDC, WORK, INFO )
RETURN
END IF
*
@@ -403,7 +417,7 @@ SUBROUTINE ZLAMSWLQ( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
*
END IF
*
- WORK(1) = LW
+ WORK( 1 ) = LWMIN
RETURN
*
* End of ZLAMSWLQ
diff --git a/lapack-netlib/SRC/zlamtsqr.f b/lapack-netlib/SRC/zlamtsqr.f
index 5030cb75fd..03770c06e3 100644
--- a/lapack-netlib/SRC/zlamtsqr.f
+++ b/lapack-netlib/SRC/zlamtsqr.f
@@ -128,22 +128,24 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*>
+*> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
+*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
*> The dimension of the array WORK.
+*> If MIN(M,N,K) = 0, LWORK >= 1.
+*> If SIDE = 'L', LWORK >= max(1,N*NB).
+*> If SIDE = 'R', LWORK >= max(1,MB*NB).
*>
-*> If SIDE = 'L', LWORK >= max(1,N)*NB;
-*> if SIDE = 'R', LWORK >= max(1,MB)*NB.
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
-*>
*> \endverbatim
+*>
*> \param[out] INFO
*> \verbatim
*> INFO is INTEGER
@@ -191,46 +193,50 @@
*> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
*> \endverbatim
*>
+*> \ingroup lamtsqr
+*>
* =====================================================================
SUBROUTINE ZLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
- $ LDT, C, LDC, WORK, LWORK, INFO )
+ $ LDT, C, LDC, WORK, LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*
* .. Scalar Arguments ..
- CHARACTER SIDE, TRANS
- INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
+ CHARACTER SIDE, TRANS
+ INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC
* ..
* .. Array Arguments ..
- COMPLEX*16 A( LDA, * ), WORK( * ), C(LDC, * ),
- $ T( LDT, * )
+ COMPLEX*16 A( LDA, * ), WORK( * ), C( LDC, * ),
+ $ T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
- INTEGER I, II, KK, LW, CTR, Q
+ LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
+ INTEGER I, II, KK, LW, CTR, Q, MINMNK, LWMIN
* ..
* .. External Functions ..
LOGICAL LSAME
EXTERNAL LSAME
+* ..
* .. External Subroutines ..
- EXTERNAL ZGEMQRT, ZTPMQRT, XERBLA
+ EXTERNAL ZGEMQRT, ZTPMQRT, XERBLA
* ..
* .. Executable Statements ..
*
* Test the input arguments
*
- LQUERY = LWORK.LT.0
+ INFO = 0
+ LQUERY = ( LWORK.EQ.-1 )
NOTRAN = LSAME( TRANS, 'N' )
TRAN = LSAME( TRANS, 'C' )
LEFT = LSAME( SIDE, 'L' )
RIGHT = LSAME( SIDE, 'R' )
- IF (LEFT) THEN
+ IF( LEFT ) THEN
LW = N * NB
Q = M
ELSE
@@ -238,11 +244,17 @@ SUBROUTINE ZLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
Q = N
END IF
*
- INFO = 0
+ MINMNK = MIN( M, N, K )
+ IF( MINMNK.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = MAX( 1, LW )
+ END IF
+*
IF( .NOT.LEFT .AND. .NOT.RIGHT ) THEN
- INFO = -1
+ INFO = -1
ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN
- INFO = -2
+ INFO = -2
ELSE IF( M.LT.K ) THEN
INFO = -3
ELSE IF( N.LT.0 ) THEN
@@ -253,38 +265,38 @@ SUBROUTINE ZLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
INFO = -7
ELSE IF( LDA.LT.MAX( 1, Q ) ) THEN
INFO = -9
- ELSE IF( LDT.LT.MAX( 1, NB) ) THEN
+ ELSE IF( LDT.LT.MAX( 1, NB ) ) THEN
INFO = -11
ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
- INFO = -13
- ELSE IF(( LWORK.LT.MAX(1,LW)).AND.(.NOT.LQUERY)) THEN
+ INFO = -13
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -15
END IF
*
-* Determine the block size if it is tall skinny or short and wide
-*
- IF( INFO.EQ.0) THEN
- WORK(1) = LW
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = LWMIN
END IF
*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'ZLAMTSQR', -INFO )
RETURN
- ELSE IF (LQUERY) THEN
- RETURN
+ ELSE IF( LQUERY ) THEN
+ RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N,K).EQ.0 ) THEN
+ IF( MINMNK.EQ.0 ) THEN
RETURN
END IF
+*
+* Determine the block size if it is tall skinny or short and wide
*
IF((MB.LE.K).OR.(MB.GE.MAX(M,N,K))) THEN
CALL ZGEMQRT( SIDE, TRANS, M, N, K, NB, A, LDA,
- $ T, LDT, C, LDC, WORK, INFO)
+ $ T, LDT, C, LDC, WORK, INFO )
RETURN
- END IF
+ END IF
*
IF(LEFT.AND.NOTRAN) THEN
*
@@ -410,7 +422,7 @@ SUBROUTINE ZLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T,
*
END IF
*
- WORK(1) = LW
+ WORK( 1 ) = LWMIN
RETURN
*
* End of ZLAMTSQR
diff --git a/lapack-netlib/SRC/zlaswlq.f b/lapack-netlib/SRC/zlaswlq.f
index be4c48539a..7352071320 100644
--- a/lapack-netlib/SRC/zlaswlq.f
+++ b/lapack-netlib/SRC/zlaswlq.f
@@ -96,22 +96,23 @@
*> The leading dimension of the array T. LDT >= MB.
*> \endverbatim
*>
-*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*>
+*> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= MB*M.
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MB*M, otherwise.
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
-*>
*> \endverbatim
+*>
*> \param[out] INFO
*> \verbatim
*> INFO is INTEGER
@@ -159,33 +160,37 @@
*> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
*> \endverbatim
*>
+*> \ingroup laswlq
+*>
* =====================================================================
SUBROUTINE ZLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
- $ INFO)
+ $ INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. --
*
* .. Scalar Arguments ..
- INTEGER INFO, LDA, M, N, MB, NB, LWORK, LDT
+ INTEGER INFO, LDA, M, N, MB, NB, LWORK, LDT
* ..
* .. Array Arguments ..
- COMPLEX*16 A( LDA, * ), WORK( * ), T( LDT, *)
+ COMPLEX*16 A( LDA, * ), WORK( * ), T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LQUERY
- INTEGER I, II, KK, CTR
+ LOGICAL LQUERY
+ INTEGER I, II, KK, CTR, MINMN, LWMIN
* ..
* .. EXTERNAL FUNCTIONS ..
LOGICAL LSAME
EXTERNAL LSAME
+* ..
* .. EXTERNAL SUBROUTINES ..
EXTERNAL ZGELQT, ZTPLQT, XERBLA
+* ..
* .. INTRINSIC FUNCTIONS ..
INTRINSIC MAX, MIN, MOD
* ..
@@ -196,12 +201,19 @@ SUBROUTINE ZLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
INFO = 0
*
LQUERY = ( LWORK.EQ.-1 )
+*
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = M*MB
+ END IF
*
IF( M.LT.0 ) THEN
INFO = -1
ELSE IF( N.LT.0 .OR. N.LT.M ) THEN
INFO = -2
- ELSE IF( MB.LT.1 .OR. ( MB.GT.M .AND. M.GT.0 )) THEN
+ ELSE IF( MB.LT.1 .OR. ( MB.GT.M .AND. M.GT.0 ) ) THEN
INFO = -3
ELSE IF( NB.LE.0 ) THEN
INFO = -4
@@ -209,60 +221,61 @@ SUBROUTINE ZLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
INFO = -6
ELSE IF( LDT.LT.MB ) THEN
INFO = -8
- ELSE IF( ( LWORK.LT.M*MB) .AND. (.NOT.LQUERY) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -10
END IF
- IF( INFO.EQ.0) THEN
- WORK(1) = MB*M
+*
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = LWMIN
END IF
*
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'ZLASWLQ', -INFO )
RETURN
- ELSE IF (LQUERY) THEN
- RETURN
+ ELSE IF( LQUERY ) THEN
+ RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N).EQ.0 ) THEN
- RETURN
+ IF( MINMN.EQ.0 ) THEN
+ RETURN
END IF
*
* The LQ Decomposition
*
- IF((M.GE.N).OR.(NB.LE.M).OR.(NB.GE.N)) THEN
- CALL ZGELQT( M, N, MB, A, LDA, T, LDT, WORK, INFO)
+ IF( (M.GE.N) .OR. (NB.LE.M) .OR. (NB.GE.N) ) THEN
+ CALL ZGELQT( M, N, MB, A, LDA, T, LDT, WORK, INFO )
RETURN
- END IF
+ END IF
*
- KK = MOD((N-M),(NB-M))
- II=N-KK+1
+ KK = MOD((N-M),(NB-M))
+ II = N-KK+1
*
-* Compute the LQ factorization of the first block A(1:M,1:NB)
+* Compute the LQ factorization of the first block A(1:M,1:NB)
*
- CALL ZGELQT( M, NB, MB, A(1,1), LDA, T, LDT, WORK, INFO)
- CTR = 1
+ CALL ZGELQT( M, NB, MB, A(1,1), LDA, T, LDT, WORK, INFO )
+ CTR = 1
*
- DO I = NB+1, II-NB+M , (NB-M)
+ DO I = NB+1, II-NB+M, (NB-M)
*
-* Compute the QR factorization of the current block A(1:M,I:I+NB-M)
+* Compute the QR factorization of the current block A(1:M,I:I+NB-M)
*
- CALL ZTPLQT( M, NB-M, 0, MB, A(1,1), LDA, A( 1, I ),
- $ LDA, T(1, CTR * M + 1),
- $ LDT, WORK, INFO )
- CTR = CTR + 1
- END DO
+ CALL ZTPLQT( M, NB-M, 0, MB, A(1,1), LDA, A( 1, I ),
+ $ LDA, T(1, CTR * M + 1),
+ $ LDT, WORK, INFO )
+ CTR = CTR + 1
+ END DO
*
* Compute the QR factorization of the last block A(1:M,II:N)
*
- IF (II.LE.N) THEN
+ IF( II.LE.N ) THEN
CALL ZTPLQT( M, KK, 0, MB, A(1,1), LDA, A( 1, II ),
- $ LDA, T(1, CTR * M + 1), LDT,
- $ WORK, INFO )
- END IF
+ $ LDA, T(1, CTR * M + 1), LDT,
+ $ WORK, INFO )
+ END IF
*
- WORK( 1 ) = M * MB
+ WORK( 1 ) = LWMIN
RETURN
*
* End of ZLASWLQ
diff --git a/lapack-netlib/SRC/zlatrs3.f b/lapack-netlib/SRC/zlatrs3.f
index 231a17274a..27eac839bc 100644
--- a/lapack-netlib/SRC/zlatrs3.f
+++ b/lapack-netlib/SRC/zlatrs3.f
@@ -158,7 +158,11 @@
*> \endverbatim
*>
*> \param[in] LWORK
+*> \verbatim
*> LWORK is INTEGER
+*> The dimension of the array WORK.
+*>
+*> If MIN(N,NRHS) = 0, LWORK >= 1, else
*> LWORK >= MAX(1, 2*NBA * MAX(NBA, MIN(NRHS, 32)), where
*> NBA = (N + NB - 1)/NB and NB is the optimal block size.
*>
@@ -166,6 +170,7 @@
*> only calculates the optimal dimensions of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
+*> \endverbatim
*>
*> \param[out] INFO
*> \verbatim
@@ -182,7 +187,7 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
-*> \ingroup doubleOTHERauxiliary
+*> \ingroup latrs3
*> \par Further Details:
* =====================
* \verbatim
@@ -257,7 +262,7 @@ SUBROUTINE ZLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
LOGICAL LQUERY, NOTRAN, NOUNIT, UPPER
INTEGER AWRK, I, IFIRST, IINC, ILAST, II, I1, I2, J,
$ JFIRST, JINC, JLAST, J1, J2, K, KK, K1, K2,
- $ LANRM, LDS, LSCALE, NB, NBA, NBX, RHS
+ $ LANRM, LDS, LSCALE, NB, NBA, NBX, RHS, LWMIN
DOUBLE PRECISION ANRM, BIGNUM, BNRM, RSCAL, SCAL, SCALOC,
$ SCAMIN, SMLNUM, TMAX
* ..
@@ -296,15 +301,24 @@ SUBROUTINE ZLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
* row. WORK( I + KK * LDS ) is the scale factor of the vector
* segment associated with the I-th block row and the KK-th vector
* in the block column.
+*
LSCALE = NBA * MAX( NBA, MIN( NRHS, NBRHS ) )
LDS = NBA
+*
* The second part stores upper bounds of the triangular A. There are
* a total of NBA x NBA blocks, of which only the upper triangular
* part or the lower triangular part is referenced. The upper bound of
* the block A( I, J ) is stored as WORK( AWRK + I + J * NBA ).
+*
LANRM = NBA * NBA
AWRK = LSCALE
- WORK( 1 ) = LSCALE + LANRM
+*
+ IF( MIN( N, NRHS ).EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = LSCALE + LANRM
+ END IF
+ WORK( 1 ) = LWMIN
*
* Test the input parameters.
*
@@ -326,7 +340,7 @@ SUBROUTINE ZLATRS3( UPLO, TRANS, DIAG, NORMIN, N, NRHS, A, LDA,
INFO = -8
ELSE IF( LDX.LT.MAX( 1, N ) ) THEN
INFO = -10
- ELSE IF( .NOT.LQUERY .AND. LWORK.LT.WORK( 1 ) ) THEN
+ ELSE IF( .NOT.LQUERY .AND. LWORK.LT.LWMIN ) THEN
INFO = -14
END IF
IF( INFO.NE.0 ) THEN
diff --git a/lapack-netlib/SRC/zlatsqr.f b/lapack-netlib/SRC/zlatsqr.f
index 8c938aebc9..24d00f28a8 100644
--- a/lapack-netlib/SRC/zlatsqr.f
+++ b/lapack-netlib/SRC/zlatsqr.f
@@ -101,15 +101,18 @@
*>
*> \param[out] WORK
*> \verbatim
-*> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
+*> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
+*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
*> \endverbatim
*>
*> \param[in] LWORK
*> \verbatim
*> LWORK is INTEGER
-*> The dimension of the array WORK. LWORK >= NB*N.
+*> The dimension of the array WORK.
+*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= NB*N, otherwise.
+*>
*> If LWORK = -1, then a workspace query is assumed; the routine
-*> only calculates the optimal size of the WORK array, returns
+*> only calculates the minimal size of the WORK array, returns
*> this value as the first entry of the WORK array, and no error
*> message related to LWORK is issued by XERBLA.
*> \endverbatim
@@ -161,33 +164,37 @@
*> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
*> \endverbatim
*>
+*> \ingroup latsqr
+*>
* =====================================================================
SUBROUTINE ZLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
- $ LWORK, INFO)
+ $ LWORK, INFO )
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. --
*
* .. Scalar Arguments ..
- INTEGER INFO, LDA, M, N, MB, NB, LDT, LWORK
+ INTEGER INFO, LDA, M, N, MB, NB, LDT, LWORK
* ..
* .. Array Arguments ..
- COMPLEX*16 A( LDA, * ), WORK( * ), T(LDT, *)
+ COMPLEX*16 A( LDA, * ), WORK( * ), T( LDT, * )
* ..
*
* =====================================================================
*
* ..
* .. Local Scalars ..
- LOGICAL LQUERY
- INTEGER I, II, KK, CTR
+ LOGICAL LQUERY
+ INTEGER I, II, KK, CTR, LWMIN, MINMN
* ..
* .. EXTERNAL FUNCTIONS ..
LOGICAL LSAME
EXTERNAL LSAME
+* ..
* .. EXTERNAL SUBROUTINES ..
- EXTERNAL ZGEQRT, ZTPQRT, XERBLA
+ EXTERNAL ZGEQRT, ZTPQRT, XERBLA
+* ..
* .. INTRINSIC FUNCTIONS ..
INTRINSIC MAX, MIN, MOD
* ..
@@ -198,6 +205,13 @@ SUBROUTINE ZLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
INFO = 0
*
LQUERY = ( LWORK.EQ.-1 )
+*
+ MINMN = MIN( M, N )
+ IF( MINMN.EQ.0 ) THEN
+ LWMIN = 1
+ ELSE
+ LWMIN = N*NB
+ END IF
*
IF( M.LT.0 ) THEN
INFO = -1
@@ -205,64 +219,65 @@ SUBROUTINE ZLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
INFO = -2
ELSE IF( MB.LT.1 ) THEN
INFO = -3
- ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 )) THEN
+ ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 ) ) THEN
INFO = -4
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
INFO = -6
ELSE IF( LDT.LT.NB ) THEN
INFO = -8
- ELSE IF( LWORK.LT.(N*NB) .AND. (.NOT.LQUERY) ) THEN
+ ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN
INFO = -10
END IF
- IF( INFO.EQ.0) THEN
- WORK(1) = NB*N
+*
+ IF( INFO.EQ.0 ) THEN
+ WORK( 1 ) = LWMIN
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'ZLATSQR', -INFO )
RETURN
- ELSE IF (LQUERY) THEN
- RETURN
+ ELSE IF( LQUERY ) THEN
+ RETURN
END IF
*
* Quick return if possible
*
- IF( MIN(M,N).EQ.0 ) THEN
- RETURN
+ IF( MINMN.EQ.0 ) THEN
+ RETURN
END IF
*
* The QR Decomposition
*
- IF ((MB.LE.N).OR.(MB.GE.M)) THEN
- CALL ZGEQRT( M, N, NB, A, LDA, T, LDT, WORK, INFO)
- RETURN
- END IF
- KK = MOD((M-N),(MB-N))
- II=M-KK+1
+ IF( (MB.LE.N) .OR. (MB.GE.M) ) THEN
+ CALL ZGEQRT( M, N, NB, A, LDA, T, LDT, WORK, INFO )
+ RETURN
+ END IF
+ KK = MOD((M-N),(MB-N))
+ II = M-KK+1
*
-* Compute the QR factorization of the first block A(1:MB,1:N)
+* Compute the QR factorization of the first block A(1:MB,1:N)
*
- CALL ZGEQRT( MB, N, NB, A(1,1), LDA, T, LDT, WORK, INFO )
- CTR = 1
+ CALL ZGEQRT( MB, N, NB, A(1,1), LDA, T, LDT, WORK, INFO )
+ CTR = 1
*
- DO I = MB+1, II-MB+N , (MB-N)
+ DO I = MB+1, II-MB+N, (MB-N)
*
-* Compute the QR factorization of the current block A(I:I+MB-N,1:N)
+* Compute the QR factorization of the current block A(I:I+MB-N,1:N)
*
- CALL ZTPQRT( MB-N, N, 0, NB, A(1,1), LDA, A( I, 1 ), LDA,
- $ T(1, CTR * N + 1),
- $ LDT, WORK, INFO )
- CTR = CTR + 1
- END DO
+ CALL ZTPQRT( MB-N, N, 0, NB, A(1,1), LDA, A( I, 1 ), LDA,
+ $ T(1, CTR * N + 1),
+ $ LDT, WORK, INFO )
+ CTR = CTR + 1
+ END DO
*
-* Compute the QR factorization of the last block A(II:M,1:N)
+* Compute the QR factorization of the last block A(II:M,1:N)
*
- IF (II.LE.M) THEN
- CALL ZTPQRT( KK, N, 0, NB, A(1,1), LDA, A( II, 1 ), LDA,
- $ T(1,CTR * N + 1), LDT,
- $ WORK, INFO )
- END IF
+ IF( II.LE.M ) THEN
+ CALL ZTPQRT( KK, N, 0, NB, A(1,1), LDA, A( II, 1 ), LDA,
+ $ T(1,CTR * N + 1), LDT,
+ $ WORK, INFO )
+ END IF
*
- work( 1 ) = N*NB
+ WORK( 1 ) = LWMIN
RETURN
*
* End of ZLATSQR
diff --git a/lapack-netlib/TESTING/EIG/cerrst.f b/lapack-netlib/TESTING/EIG/cerrst.f
index 1748a2aad6..d23eb14eac 100644
--- a/lapack-netlib/TESTING/EIG/cerrst.f
+++ b/lapack-netlib/TESTING/EIG/cerrst.f
@@ -748,17 +748,17 @@ SUBROUTINE CERRST( PATH, NUNIT )
CALL CHKXER( 'CHEEVR', INFOT, NOUT, LERR, OK )
INFOT = 18
CALL CHEEVR( 'V', 'I', 'U', 1, A, 1, 0.0E0, 0.0E0, 1, 1, 0.0,
- $ M, R, Z, 1, IW, Q, 2*N-1, RW, 24*N, IW( 2*N+1 ),
+ $ M, R, Z, 1, IW, Q, 0, RW, 24*N, IW( 2*N+1 ),
$ 10*N, INFO )
CALL CHKXER( 'CHEEVR', INFOT, NOUT, LERR, OK )
INFOT = 20
CALL CHEEVR( 'V', 'I', 'U', 1, A, 1, 0.0E0, 0.0E0, 1, 1, 0.0,
- $ M, R, Z, 1, IW, Q, 2*N, RW, 24*N-1, IW( 2*N-1 ),
+ $ M, R, Z, 1, IW, Q, 2*N, RW, 0, IW( 2*N-1 ),
$ 10*N, INFO )
CALL CHKXER( 'CHEEVR', INFOT, NOUT, LERR, OK )
INFOT = 22
CALL CHEEVR( 'V', 'I', 'U', 1, A, 1, 0.0E0, 0.0E0, 1, 1, 0.0,
- $ M, R, Z, 1, IW, Q, 2*N, RW, 24*N, IW, 10*N-1,
+ $ M, R, Z, 1, IW, Q, 2*N, RW, 24*N, IW, 0,
$ INFO )
CALL CHKXER( 'CHEEVR', INFOT, NOUT, LERR, OK )
NT = NT + 12
@@ -830,19 +830,19 @@ SUBROUTINE CERRST( PATH, NUNIT )
INFOT = 18
CALL CHEEVR_2STAGE( 'N', 'I', 'U', 1, A, 1,
$ 0.0, 0.0, 1, 1, 0.0,
- $ M, R, Z, 1, IW, Q, 2*N-1, RW, 24*N, IW( 2*N+1 ),
+ $ M, R, Z, 1, IW, Q, 0, RW, 24*N, IW( 2*N+1 ),
$ 10*N, INFO )
CALL CHKXER( 'CHEEVR_2STAGE', INFOT, NOUT, LERR, OK )
INFOT = 20
CALL CHEEVR_2STAGE( 'N', 'I', 'U', 1, A, 1,
$ 0.0, 0.0, 1, 1, 0.0,
- $ M, R, Z, 1, IW, Q, 26*N, RW, 24*N-1, IW( 2*N-1 ),
+ $ M, R, Z, 1, IW, Q, 26*N, RW, 0, IW( 2*N-1 ),
$ 10*N, INFO )
CALL CHKXER( 'CHEEVR_2STAGE', INFOT, NOUT, LERR, OK )
INFOT = 22
CALL CHEEVR_2STAGE( 'N', 'I', 'U', 1, A, 1,
$ 0.0, 0.0, 1, 1, 0.0,
- $ M, R, Z, 1, IW, Q, 26*N, RW, 24*N, IW, 10*N-1,
+ $ M, R, Z, 1, IW, Q, 26*N, RW, 24*N, IW, 0,
$ INFO )
CALL CHKXER( 'CHEEVR_2STAGE', INFOT, NOUT, LERR, OK )
NT = NT + 13
diff --git a/lapack-netlib/TESTING/EIG/chkxer.f b/lapack-netlib/TESTING/EIG/chkxer.f
index fd00bb65a7..70caf7e0a3 100644
--- a/lapack-netlib/TESTING/EIG/chkxer.f
+++ b/lapack-netlib/TESTING/EIG/chkxer.f
@@ -61,7 +61,7 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
RETURN
*
9999 FORMAT( ' *** Illegal value of parameter number ', I2,
- $ ' not detected by ', A6, ' ***' )
+ $ ' not detected by ', A, ' ***' )
*
* End of CHKXER
*
diff --git a/lapack-netlib/TESTING/EIG/derrst.f b/lapack-netlib/TESTING/EIG/derrst.f
index 0595386448..7d111e2e0d 100644
--- a/lapack-netlib/TESTING/EIG/derrst.f
+++ b/lapack-netlib/TESTING/EIG/derrst.f
@@ -735,12 +735,12 @@ SUBROUTINE DERRST( PATH, NUNIT )
CALL CHKXER( 'DSYEVR', INFOT, NOUT, LERR, OK )
INFOT = 18
CALL DSYEVR( 'V', 'I', 'U', 1, A, 1, 0.0D0, 0.0D0, 1, 1, 0.0D0,
- $ M, R, Z, 1, IW, Q, 26*N-1, IW( 2*N+1 ), 10*N,
+ $ M, R, Z, 1, IW, Q, 0, IW( 2*N+1 ), 10*N,
$ INFO )
CALL CHKXER( 'DSYEVR', INFOT, NOUT, LERR, OK )
INFOT = 20
CALL DSYEVR( 'V', 'I', 'U', 1, A, 1, 0.0D0, 0.0D0, 1, 1, 0.0D0,
- $ M, R, Z, 1, IW, Q, 26*N, IW( 2*N+1 ), 10*N-1,
+ $ M, R, Z, 1, IW, Q, 26*N, IW( 2*N+1 ), 0,
$ INFO )
CALL CHKXER( 'DSYEVR', INFOT, NOUT, LERR, OK )
NT = NT + 11
diff --git a/lapack-netlib/TESTING/EIG/serrst.f b/lapack-netlib/TESTING/EIG/serrst.f
index b87fc42ef7..4083463829 100644
--- a/lapack-netlib/TESTING/EIG/serrst.f
+++ b/lapack-netlib/TESTING/EIG/serrst.f
@@ -733,12 +733,12 @@ SUBROUTINE SERRST( PATH, NUNIT )
CALL CHKXER( 'SSYEVR', INFOT, NOUT, LERR, OK )
INFOT = 18
CALL SSYEVR( 'V', 'I', 'U', 1, A, 1, 0.0E0, 0.0E0, 1, 1, 0.0,
- $ M, R, Z, 1, IW, Q, 26*N-1, IW( 2*N+1 ), 10*N,
+ $ M, R, Z, 1, IW, Q, 0, IW( 2*N+1 ), 10*N,
$ INFO )
CALL CHKXER( 'SSYEVR', INFOT, NOUT, LERR, OK )
INFOT = 20
CALL SSYEVR( 'V', 'I', 'U', 1, A, 1, 0.0E0, 0.0E0, 1, 1, 0.0,
- $ M, R, Z, 1, IW, Q, 26*N, IW( 2*N+1 ), 10*N-1,
+ $ M, R, Z, 1, IW, Q, 26*N, IW( 2*N+1 ), 0,
$ INFO )
CALL CHKXER( 'SSYEVR', INFOT, NOUT, LERR, OK )
NT = NT + 11
diff --git a/lapack-netlib/TESTING/EIG/zerrst.f b/lapack-netlib/TESTING/EIG/zerrst.f
index d7b41c0537..31881c4de1 100644
--- a/lapack-netlib/TESTING/EIG/zerrst.f
+++ b/lapack-netlib/TESTING/EIG/zerrst.f
@@ -748,17 +748,17 @@ SUBROUTINE ZERRST( PATH, NUNIT )
CALL CHKXER( 'ZHEEVR', INFOT, NOUT, LERR, OK )
INFOT = 18
CALL ZHEEVR( 'V', 'I', 'U', 1, A, 1, 0.0D0, 0.0D0, 1, 1, 0.0D0,
- $ M, R, Z, 1, IW, Q, 2*N-1, RW, 24*N, IW( 2*N+1 ),
+ $ M, R, Z, 1, IW, Q, 0, RW, 24*N, IW( 2*N+1 ),
$ 10*N, INFO )
CALL CHKXER( 'ZHEEVR', INFOT, NOUT, LERR, OK )
INFOT = 20
CALL ZHEEVR( 'V', 'I', 'U', 1, A, 1, 0.0D0, 0.0D0, 1, 1, 0.0D0,
- $ M, R, Z, 1, IW, Q, 2*N, RW, 24*N-1, IW( 2*N-1 ),
+ $ M, R, Z, 1, IW, Q, 2*N, RW, 0, IW( 2*N-1 ),
$ 10*N, INFO )
CALL CHKXER( 'ZHEEVR', INFOT, NOUT, LERR, OK )
INFOT = 22
CALL ZHEEVR( 'V', 'I', 'U', 1, A, 1, 0.0D0, 0.0D0, 1, 1, 0.0D0,
- $ M, R, Z, 1, IW, Q, 2*N, RW, 24*N, IW, 10*N-1,
+ $ M, R, Z, 1, IW, Q, 2*N, RW, 24*N, IW, 0,
$ INFO )
CALL CHKXER( 'ZHEEVR', INFOT, NOUT, LERR, OK )
NT = NT + 12
@@ -830,19 +830,19 @@ SUBROUTINE ZERRST( PATH, NUNIT )
INFOT = 18
CALL ZHEEVR_2STAGE( 'N', 'I', 'U', 1, A, 1,
$ 0.0D0, 0.0D0, 1, 1, 0.0D0,
- $ M, R, Z, 1, IW, Q, 2*N-1, RW, 24*N, IW( 2*N+1 ),
+ $ M, R, Z, 1, IW, Q, 0, RW, 24*N, IW( 2*N+1 ),
$ 10*N, INFO )
CALL CHKXER( 'ZHEEVR_2STAGE', INFOT, NOUT, LERR, OK )
INFOT = 20
CALL ZHEEVR_2STAGE( 'N', 'I', 'U', 1, A, 1,
$ 0.0D0, 0.0D0, 1, 1, 0.0D0,
- $ M, R, Z, 1, IW, Q, 26*N, RW, 24*N-1, IW( 2*N-1 ),
+ $ M, R, Z, 1, IW, Q, 26*N, RW, 0, IW( 2*N-1 ),
$ 10*N, INFO )
CALL CHKXER( 'ZHEEVR_2STAGE', INFOT, NOUT, LERR, OK )
INFOT = 22
CALL ZHEEVR_2STAGE( 'N', 'I', 'U', 1, A, 1,
$ 0.0D0, 0.0D0, 1, 1, 0.0D0,
- $ M, R, Z, 1, IW, Q, 26*N, RW, 24*N, IW, 10*N-1,
+ $ M, R, Z, 1, IW, Q, 26*N, RW, 24*N, IW, 0,
$ INFO )
CALL CHKXER( 'ZHEEVR_2STAGE', INFOT, NOUT, LERR, OK )
NT = NT + 13
diff --git a/lapack-netlib/TESTING/LIN/cchkhe_aa_2stage.f b/lapack-netlib/TESTING/LIN/cchkhe_aa_2stage.f
index 30a61261f5..d79978e557 100644
--- a/lapack-netlib/TESTING/LIN/cchkhe_aa_2stage.f
+++ b/lapack-netlib/TESTING/LIN/cchkhe_aa_2stage.f
@@ -433,9 +433,9 @@ SUBROUTINE CCHKHE_AA_2STAGE( DOTYPE, NN, NVAL, NNB, NBVAL, NNS,
* block factorization, LWORK is the length of AINV.
*
SRNAMT = 'CHETRF_AA_2STAGE'
- LWORK = MIN(N*NB, 3*NMAX*NMAX)
- CALL CHETRF_AA_2STAGE( UPLO, N, AFAC, LDA,
- $ AINV, (3*NB+1)*N,
+ LWORK = MIN( MAX( 1, N*NB ), 3*NMAX*NMAX)
+ CALL CHETRF_AA_2STAGE( UPLO, N, AFAC, LDA,
+ $ AINV, MAX( 1, (3*NB+1)*N ),
$ IWORK, IWORK( 1+N ),
$ WORK, LWORK,
$ INFO )
@@ -517,7 +517,6 @@ SUBROUTINE CCHKHE_AA_2STAGE( DOTYPE, NN, NVAL, NNB, NBVAL, NNS,
CALL CLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
*
SRNAMT = 'CHETRS_AA_2STAGE'
- LWORK = MAX( 1, 3*N-2 )
CALL CHETRS_AA_2STAGE( UPLO, N, NRHS, AFAC, LDA,
$ AINV, (3*NB+1)*N, IWORK, IWORK( 1+N ),
$ X, LDA, INFO )
diff --git a/lapack-netlib/TESTING/LIN/cdrvhe_aa_2stage.f b/lapack-netlib/TESTING/LIN/cdrvhe_aa_2stage.f
index 51cef512d8..83e8a17b0f 100644
--- a/lapack-netlib/TESTING/LIN/cdrvhe_aa_2stage.f
+++ b/lapack-netlib/TESTING/LIN/cdrvhe_aa_2stage.f
@@ -400,9 +400,9 @@ SUBROUTINE CDRVHE_AA_2STAGE(
* Factor the matrix and solve the system using CHESV_AA.
*
SRNAMT = 'CHESV_AA_2STAGE '
- LWORK = MIN(N*NB, 3*NMAX*NMAX)
+ LWORK = MIN( MAX( 1, N*NB ), 3*NMAX*NMAX)
CALL CHESV_AA_2STAGE( UPLO, N, NRHS, AFAC, LDA,
- $ AINV, (3*NB+1)*N,
+ $ AINV, MAX( 1, (3*NB+1)*N ),
$ IWORK, IWORK( 1+N ),
$ X, LDA, WORK, LWORK, INFO )
*
diff --git a/lapack-netlib/TESTING/LIN/dchksy_aa_2stage.f b/lapack-netlib/TESTING/LIN/dchksy_aa_2stage.f
index bc4e77a5aa..1940351a40 100644
--- a/lapack-netlib/TESTING/LIN/dchksy_aa_2stage.f
+++ b/lapack-netlib/TESTING/LIN/dchksy_aa_2stage.f
@@ -421,9 +421,9 @@ SUBROUTINE DCHKSY_AA_2STAGE( DOTYPE, NN, NVAL, NNB, NBVAL, NNS,
* block factorization, LWORK is the length of AINV.
*
SRNAMT = 'DSYTRF_AA_2STAGE'
- LWORK = MIN(N*NB, 3*NMAX*NMAX)
+ LWORK = MIN( MAX( 1, N*NB ), 3*NMAX*NMAX )
CALL DSYTRF_AA_2STAGE( UPLO, N, AFAC, LDA,
- $ AINV, (3*NB+1)*N,
+ $ AINV, MAX( 1, (3*NB+1)*N ),
$ IWORK, IWORK( 1+N ),
$ WORK, LWORK,
$ INFO )
@@ -503,7 +503,6 @@ SUBROUTINE DCHKSY_AA_2STAGE( DOTYPE, NN, NVAL, NNB, NBVAL, NNS,
CALL DLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
*
SRNAMT = 'DSYTRS_AA_2STAGE'
- LWORK = MAX( 1, 3*N-2 )
CALL DSYTRS_AA_2STAGE( UPLO, N, NRHS, AFAC, LDA,
$ AINV, (3*NB+1)*N, IWORK, IWORK( 1+N ),
$ X, LDA, INFO )
diff --git a/lapack-netlib/TESTING/LIN/ddrvsy_aa_2stage.f b/lapack-netlib/TESTING/LIN/ddrvsy_aa_2stage.f
index 91c9e8e9af..d04106ae30 100644
--- a/lapack-netlib/TESTING/LIN/ddrvsy_aa_2stage.f
+++ b/lapack-netlib/TESTING/LIN/ddrvsy_aa_2stage.f
@@ -400,9 +400,9 @@ SUBROUTINE DDRVSY_AA_2STAGE(
* Factor the matrix and solve the system using DSYSV_AA.
*
SRNAMT = 'DSYSV_AA_2STAGE '
- LWORK = MIN(N*NB, 3*NMAX*NMAX)
+ LWORK = MIN( MAX( 1, N*NB ), 3*NMAX*NMAX )
CALL DSYSV_AA_2STAGE( UPLO, N, NRHS, AFAC, LDA,
- $ AINV, (3*NB+1)*N,
+ $ AINV, MAX( 1, (3*NB+1)*N ),
$ IWORK, IWORK( 1+N ),
$ X, LDA, WORK, LWORK, INFO )
*
diff --git a/lapack-netlib/TESTING/LIN/schksy_aa_2stage.f b/lapack-netlib/TESTING/LIN/schksy_aa_2stage.f
index d3c27ae561..6490cd7c37 100644
--- a/lapack-netlib/TESTING/LIN/schksy_aa_2stage.f
+++ b/lapack-netlib/TESTING/LIN/schksy_aa_2stage.f
@@ -423,9 +423,9 @@ SUBROUTINE SCHKSY_AA_2STAGE( DOTYPE, NN, NVAL, NNB, NBVAL, NNS,
* block factorization, LWORK is the length of AINV.
*
SRNAMT = 'SSYTRF_AA_2STAGE'
- LWORK = MIN(N*NB, 3*NMAX*NMAX)
+ LWORK = MIN( MAX( 1, N*NB ), 3*NMAX*NMAX )
CALL SSYTRF_AA_2STAGE( UPLO, N, AFAC, LDA,
- $ AINV, (3*NB+1)*N,
+ $ AINV, MAX( 1, (3*NB+1)*N ),
$ IWORK, IWORK( 1+N ),
$ WORK, LWORK,
$ INFO )
@@ -505,7 +505,6 @@ SUBROUTINE SCHKSY_AA_2STAGE( DOTYPE, NN, NVAL, NNB, NBVAL, NNS,
CALL SLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
*
SRNAMT = 'SSYTRS_AA_2STAGE'
- LWORK = MAX( 1, 3*N-2 )
CALL SSYTRS_AA_2STAGE( UPLO, N, NRHS, AFAC, LDA,
$ AINV, (3*NB+1)*N, IWORK, IWORK( 1+N ),
$ X, LDA, INFO )
diff --git a/lapack-netlib/TESTING/LIN/sdrvsy_aa_2stage.f b/lapack-netlib/TESTING/LIN/sdrvsy_aa_2stage.f
index aff32bce93..319b90805e 100644
--- a/lapack-netlib/TESTING/LIN/sdrvsy_aa_2stage.f
+++ b/lapack-netlib/TESTING/LIN/sdrvsy_aa_2stage.f
@@ -400,9 +400,9 @@ SUBROUTINE SDRVSY_AA_2STAGE(
* Factor the matrix and solve the system using SSYSV_AA.
*
SRNAMT = 'SSYSV_AA_2STAGE '
- LWORK = MIN(N*NB, 3*NMAX*NMAX)
+ LWORK = MIN( MAX( 1, N*NB ), 3*NMAX*NMAX )
CALL SSYSV_AA_2STAGE( UPLO, N, NRHS, AFAC, LDA,
- $ AINV, (3*NB+1)*N,
+ $ AINV, MAX( 1, (3*NB+1)*N ),
$ IWORK, IWORK( 1+N ),
$ X, LDA, WORK, LWORK, INFO )
*
diff --git a/lapack-netlib/TESTING/LIN/zchkhe_aa_2stage.f b/lapack-netlib/TESTING/LIN/zchkhe_aa_2stage.f
index 381fac9f2d..51082f1d0b 100644
--- a/lapack-netlib/TESTING/LIN/zchkhe_aa_2stage.f
+++ b/lapack-netlib/TESTING/LIN/zchkhe_aa_2stage.f
@@ -8,7 +8,7 @@
* Definition:
* ===========
*
-* SUBROUTINE ZCHKHE_AA_2STAGE( DOTYPE, NN, NVAL, NNB, NBVAL,
+* SUBROUTINE ZCHKHE_AA_2STAGE( DOTYPE, NN, NVAL, NNB, NBVAL,
* NNS, NSVAL, THRESH, TSTERR, NMAX, A,
* AFAC, AINV, B, X, XACT, WORK, RWORK,
* IWORK, NOUT )
@@ -185,7 +185,8 @@ SUBROUTINE ZCHKHE_AA_2STAGE( DOTYPE, NN, NVAL, NNB, NBVAL, NNS,
LOGICAL DOTYPE( * )
INTEGER IWORK( * ), NBVAL( * ), NSVAL( * ), NVAL( * )
COMPLEX*16 A( * ), AFAC( * ), AINV( * ), B( * ),
- $ RWORK( * ), WORK( * ), X( * ), XACT( * )
+ $ WORK( * ), X( * ), XACT( * )
+ DOUBLE PRECISION RWORK( * )
* ..
*
* =====================================================================
@@ -430,9 +431,9 @@ SUBROUTINE ZCHKHE_AA_2STAGE( DOTYPE, NN, NVAL, NNB, NBVAL, NNS,
* block factorization, LWORK is the length of AINV.
*
SRNAMT = 'ZHETRF_AA_2STAGE'
- LWORK = MIN(N*NB, 3*NMAX*NMAX)
- CALL ZHETRF_AA_2STAGE( UPLO, N, AFAC, LDA,
- $ AINV, (3*NB+1)*N,
+ LWORK = MIN( MAX( 1, N*NB ), 3*NMAX*NMAX )
+ CALL ZHETRF_AA_2STAGE( UPLO, N, AFAC, LDA,
+ $ AINV, MAX( 1, (3*NB+1)*N ),
$ IWORK, IWORK( 1+N ),
$ WORK, LWORK,
$ INFO )
diff --git a/lapack-netlib/TESTING/LIN/zdrvhe_aa_2stage.f b/lapack-netlib/TESTING/LIN/zdrvhe_aa_2stage.f
index 9401867e0c..fcd7744912 100644
--- a/lapack-netlib/TESTING/LIN/zdrvhe_aa_2stage.f
+++ b/lapack-netlib/TESTING/LIN/zdrvhe_aa_2stage.f
@@ -400,9 +400,9 @@ SUBROUTINE ZDRVHE_AA_2STAGE(
* Factor the matrix and solve the system using ZHESV_AA.
*
SRNAMT = 'ZHESV_AA_2STAGE '
- LWORK = MIN(N*NB, 3*NMAX*NMAX)
+ LWORK = MIN( MAX( 1, N*NB ), 3*NMAX*NMAX )
CALL ZHESV_AA_2STAGE( UPLO, N, NRHS, AFAC, LDA,
- $ AINV, (3*NB+1)*N,
+ $ AINV, MAX( 1, (3*NB+1)*N ),
$ IWORK, IWORK( 1+N ),
$ X, LDA, WORK, LWORK, INFO )
*