Handle corner cases of LWORK (Reference-LAPACK PR 942)
This commit is contained in:
		
							parent
							
								
									29d6024ec5
								
							
						
					
					
						commit
						c082669ad4
					
				|  | @ -122,7 +122,8 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          For optimum performance LWORK >= (M+N)*NB, where NB | ||||||
| *>          is the optimal blocksize. | *>          is the optimal blocksize. | ||||||
| *> | *> | ||||||
|  | @ -223,8 +224,8 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL            LQUERY |       LOGICAL            LQUERY | ||||||
|       INTEGER            I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB, |       INTEGER            I, IINFO, J, LDWRKX, LDWRKY, LWKMIN, LWKOPT, | ||||||
|      $                   NBMIN, NX, WS |      $                   MINMN, NB, NBMIN, NX, WS | ||||||
| *     .. | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           SGEBD2, SGEMM, SLABRD, XERBLA |       EXTERNAL           SGEBD2, SGEMM, SLABRD, XERBLA | ||||||
|  | @ -242,9 +243,16 @@ | ||||||
| *     Test the input parameters | *     Test the input parameters | ||||||
| * | * | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       NB = MAX( 1, ILAENV( 1, 'SGEBRD', ' ', M, N, -1, -1 ) ) |       MINMN = MIN( M, N ) | ||||||
|       LWKOPT = ( M+N )*NB |       IF( MINMN.EQ.0 ) THEN | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |          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 ) |       LQUERY = ( LWORK.EQ.-1 ) | ||||||
|       IF( M.LT.0 ) THEN |       IF( M.LT.0 ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|  | @ -252,7 +260,7 @@ | ||||||
|          INFO = -2 |          INFO = -2 | ||||||
|       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN |       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN | ||||||
|          INFO = -4 |          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 |          INFO = -10 | ||||||
|       END IF |       END IF | ||||||
|       IF( INFO.LT.0 ) THEN |       IF( INFO.LT.0 ) THEN | ||||||
|  | @ -264,7 +272,6 @@ | ||||||
| * | * | ||||||
| *     Quick return if possible | *     Quick return if possible | ||||||
| * | * | ||||||
|       MINMN = MIN( M, N ) |  | ||||||
|       IF( MINMN.EQ.0 ) THEN |       IF( MINMN.EQ.0 ) THEN | ||||||
|          WORK( 1 ) = 1 |          WORK( 1 ) = 1 | ||||||
|          RETURN |          RETURN | ||||||
|  | @ -283,7 +290,7 @@ | ||||||
| *        Determine when to switch from blocked to unblocked code. | *        Determine when to switch from blocked to unblocked code. | ||||||
| * | * | ||||||
|          IF( NX.LT.MINMN ) THEN |          IF( NX.LT.MINMN ) THEN | ||||||
|             WS = ( M+N )*NB |             WS = LWKOPT | ||||||
|             IF( LWORK.LT.WS ) THEN |             IF( LWORK.LT.WS ) THEN | ||||||
| * | * | ||||||
| *              Not enough work space for the optimal NB, consider using | *              Not enough work space for the optimal NB, consider using | ||||||
|  | @ -342,7 +349,8 @@ | ||||||
| * | * | ||||||
|       CALL SGEBD2( M-I+1, N-I+1, A( I, I ), LDA, D( I ), E( I ), |       CALL SGEBD2( M-I+1, N-I+1, A( I, I ), LDA, D( I ), E( I ), | ||||||
|      $             TAUQ( I ), TAUP( I ), WORK, IINFO ) |      $             TAUQ( I ), TAUP( I ), WORK, IINFO ) | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(WS) | * | ||||||
|  |       WORK( 1 ) = SROUNDUP_LWORK( WS ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SGEBRD | *     End of SGEBRD | ||||||
|  |  | ||||||
|  | @ -89,7 +89,7 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \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. | *>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK. | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
|  | @ -173,7 +173,7 @@ | ||||||
|       INTEGER            IHI, ILO, INFO, LDA, LWORK, N |       INTEGER            IHI, ILO, INFO, LDA, LWORK, N | ||||||
| *     .. | *     .. | ||||||
| *     .. Array Arguments .. | *     .. Array Arguments .. | ||||||
|       REAL              A( LDA, * ), TAU( * ), WORK( * ) |       REAL               A( LDA, * ), TAU( * ), WORK( * ) | ||||||
| *     .. | *     .. | ||||||
| * | * | ||||||
| *  ===================================================================== | *  ===================================================================== | ||||||
|  | @ -182,7 +182,7 @@ | ||||||
|       INTEGER            NBMAX, LDT, TSIZE |       INTEGER            NBMAX, LDT, TSIZE | ||||||
|       PARAMETER          ( NBMAX = 64, LDT = NBMAX+1, |       PARAMETER          ( NBMAX = 64, LDT = NBMAX+1, | ||||||
|      $                     TSIZE = LDT*NBMAX ) |      $                     TSIZE = LDT*NBMAX ) | ||||||
|       REAL              ZERO, ONE |       REAL               ZERO, ONE | ||||||
|       PARAMETER          ( ZERO = 0.0E+0, |       PARAMETER          ( ZERO = 0.0E+0, | ||||||
|      $                     ONE = 1.0E+0 ) |      $                     ONE = 1.0E+0 ) | ||||||
| *     .. | *     .. | ||||||
|  | @ -190,7 +190,7 @@ | ||||||
|       LOGICAL            LQUERY |       LOGICAL            LQUERY | ||||||
|       INTEGER            I, IB, IINFO, IWT, J, LDWORK, LWKOPT, NB, |       INTEGER            I, IB, IINFO, IWT, J, LDWORK, LWKOPT, NB, | ||||||
|      $                   NBMIN, NH, NX |      $                   NBMIN, NH, NX | ||||||
|       REAL              EI |       REAL               EI | ||||||
| *     .. | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           SAXPY, SGEHD2, SGEMM, SLAHR2, SLARFB, STRMM, |       EXTERNAL           SAXPY, SGEHD2, SGEMM, SLAHR2, SLARFB, STRMM, | ||||||
|  | @ -222,13 +222,19 @@ | ||||||
|          INFO = -8 |          INFO = -8 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  |       NH = IHI - ILO + 1 | ||||||
|       IF( INFO.EQ.0 ) THEN |       IF( INFO.EQ.0 ) THEN | ||||||
| * | * | ||||||
| *       Compute the workspace requirements | *       Compute the workspace requirements | ||||||
| * | * | ||||||
|          NB = MIN( NBMAX, ILAENV( 1, 'SGEHRD', ' ', N, ILO, IHI, -1 ) ) |          IF( NH.LE.1 ) THEN | ||||||
|          LWKOPT = N*NB + TSIZE |             LWKOPT = 1 | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |          ELSE | ||||||
|  |             NB = MIN( NBMAX, ILAENV( 1, 'SGEHRD', ' ', N, ILO, IHI, | ||||||
|  |      $                              -1 ) ) | ||||||
|  |             LWKOPT = N*NB + TSIZE | ||||||
|  |          ENDIF | ||||||
|  |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -249,7 +255,6 @@ | ||||||
| * | * | ||||||
| *     Quick return if possible | *     Quick return if possible | ||||||
| * | * | ||||||
|       NH = IHI - ILO + 1 |  | ||||||
|       IF( NH.LE.1 ) THEN |       IF( NH.LE.1 ) THEN | ||||||
|          WORK( 1 ) = 1 |          WORK( 1 ) = 1 | ||||||
|          RETURN |          RETURN | ||||||
|  | @ -269,7 +274,7 @@ | ||||||
| * | * | ||||||
| *           Determine if workspace is large enough for blocked code | *           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 | *              Not enough workspace to use optimal NB:  determine the | ||||||
| *              minimum value of NB, and reduce NB or force use of | *              minimum value of NB, and reduce NB or force use of | ||||||
|  | @ -345,7 +350,8 @@ | ||||||
| *     Use unblocked code to reduce the rest of the matrix | *     Use unblocked code to reduce the rest of the matrix | ||||||
| * | * | ||||||
|       CALL SGEHD2( N, I, IHI, A, LDA, TAU, WORK, IINFO ) |       CALL SGEHD2( N, I, IHI, A, LDA, TAU, WORK, IINFO ) | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) | * | ||||||
|  |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -98,7 +98,7 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          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 | *>          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 | *>          values as the first entries of the T and WORK arrays, and no error | ||||||
|  | @ -295,9 +295,9 @@ | ||||||
|         T( 2 ) = MB |         T( 2 ) = MB | ||||||
|         T( 3 ) = NB |         T( 3 ) = NB | ||||||
|         IF( MINW ) THEN |         IF( MINW ) THEN | ||||||
|           WORK( 1 ) = SROUNDUP_LWORK(LWMIN) |           WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|         ELSE |         ELSE | ||||||
|           WORK( 1 ) = SROUNDUP_LWORK(LWREQ) |           WORK( 1 ) = SROUNDUP_LWORK( LWREQ ) | ||||||
|         END IF |         END IF | ||||||
|       END IF |       END IF | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -322,7 +322,7 @@ | ||||||
|      $                LWORK, INFO ) |      $                LWORK, INFO ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWREQ) |       WORK( 1 ) = SROUNDUP_LWORK( LWREQ ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SGELQ | *     End of SGELQ | ||||||
|  |  | ||||||
|  | @ -93,7 +93,8 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          For optimum performance LWORK >= M*NB, where NB is the | ||||||
| *>          optimal blocksize. | *>          optimal blocksize. | ||||||
| *> | *> | ||||||
|  | @ -175,9 +176,8 @@ | ||||||
| *     Test the input arguments | *     Test the input arguments | ||||||
| * | * | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|  |       K = MIN( M, N ) | ||||||
|       NB = ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 ) |       NB = ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 ) | ||||||
|       LWKOPT = M*NB |  | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |  | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       LQUERY = ( LWORK.EQ.-1 ) | ||||||
|       IF( M.LT.0 ) THEN |       IF( M.LT.0 ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|  | @ -185,19 +185,25 @@ | ||||||
|          INFO = -2 |          INFO = -2 | ||||||
|       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN |       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN | ||||||
|          INFO = -4 |          INFO = -4 | ||||||
|       ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN |       ELSE IF( .NOT.LQUERY ) THEN | ||||||
|          INFO = -7 |          IF( LWORK.LE.0 .OR. ( N.GT.0 .AND. LWORK.LT.MAX( 1, M ) ) ) | ||||||
|  |      $      INFO = -7 | ||||||
|       END IF |       END IF | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|          CALL XERBLA( 'SGELQF', -INFO ) |          CALL XERBLA( 'SGELQF', -INFO ) | ||||||
|          RETURN |          RETURN | ||||||
|       ELSE IF( LQUERY ) THEN |       ELSE IF( LQUERY ) THEN | ||||||
|  |          IF( K.EQ.0 ) THEN | ||||||
|  |             LWKOPT = 1 | ||||||
|  |          ELSE | ||||||
|  |             LWKOPT = M*NB | ||||||
|  |          END IF | ||||||
|  |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
| *     Quick return if possible | *     Quick return if possible | ||||||
| * | * | ||||||
|       K = MIN( M, N ) |  | ||||||
|       IF( K.EQ.0 ) THEN |       IF( K.EQ.0 ) THEN | ||||||
|          WORK( 1 ) = 1 |          WORK( 1 ) = 1 | ||||||
|          RETURN |          RETURN | ||||||
|  | @ -267,7 +273,7 @@ | ||||||
|      $   CALL SGELQ2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK, |      $   CALL SGELQ2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK, | ||||||
|      $                IINFO ) |      $                IINFO ) | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(IWS) |       WORK( 1 ) = SROUNDUP_LWORK( IWS ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SGELQF | *     End of SGELQF | ||||||
|  |  | ||||||
|  | @ -110,13 +110,14 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \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 | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          If LWORK = -1, then a workspace query is assumed. The routine | ||||||
| *>          only calculates the size of the WORK array, returns this | *>          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 | ||||||
|  | @ -187,7 +188,7 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL            LEFT, RIGHT, TRAN, NOTRAN, LQUERY |       LOGICAL            LEFT, RIGHT, TRAN, NOTRAN, LQUERY | ||||||
|       INTEGER            MB, NB, LW, NBLCKS, MN |       INTEGER            MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|  | @ -207,7 +208,7 @@ | ||||||
| * | * | ||||||
| *     Test the input arguments | *     Test the input arguments | ||||||
| * | * | ||||||
|       LQUERY  = LWORK.EQ.-1 |       LQUERY  = ( LWORK.EQ.-1 ) | ||||||
|       NOTRAN  = LSAME( TRANS, 'N' ) |       NOTRAN  = LSAME( TRANS, 'N' ) | ||||||
|       TRAN    = LSAME( TRANS, 'T' ) |       TRAN    = LSAME( TRANS, 'T' ) | ||||||
|       LEFT    = LSAME( SIDE, 'L' ) |       LEFT    = LSAME( SIDE, 'L' ) | ||||||
|  | @ -222,6 +223,13 @@ | ||||||
|         LW = M * MB |         LW = M * MB | ||||||
|         MN = N |         MN = N | ||||||
|       END IF |       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( ( NB.GT.K ) .AND. ( MN.GT.K ) ) THEN | ||||||
|         IF( MOD( MN - K, NB - K ) .EQ. 0 ) THEN |         IF( MOD( MN - K, NB - K ) .EQ. 0 ) THEN | ||||||
|  | @ -250,12 +258,12 @@ | ||||||
|         INFO = -9 |         INFO = -9 | ||||||
|       ELSE IF( LDC.LT.MAX( 1, M ) ) THEN |       ELSE IF( LDC.LT.MAX( 1, M ) ) THEN | ||||||
|         INFO = -11 |         INFO = -11 | ||||||
|       ELSE IF( ( LWORK.LT.MAX( 1, LW ) ) .AND. ( .NOT.LQUERY ) ) THEN |       ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN | ||||||
|         INFO = -13 |         INFO = -13 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.EQ.0 ) THEN |       IF( INFO.EQ.0 ) THEN | ||||||
|         WORK( 1 ) = SROUNDUP_LWORK( LW ) |         WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -267,7 +275,7 @@ | ||||||
| * | * | ||||||
| *     Quick return if possible | *     Quick return if possible | ||||||
| * | * | ||||||
|       IF( MIN( M, N, K ).EQ.0 ) THEN |       IF( MINMNK.EQ.0 ) THEN | ||||||
|         RETURN |         RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -280,7 +288,7 @@ | ||||||
|      $                 MB, C, LDC, WORK, LWORK, INFO ) |      $                 MB, C, LDC, WORK, LWORK, INFO ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK( LW ) |       WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -189,12 +189,13 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL            LEFT, RIGHT, TRAN, NOTRAN, LQUERY |       LOGICAL            LEFT, RIGHT, TRAN, NOTRAN, LQUERY | ||||||
|       INTEGER            MB, NB, LW, NBLCKS, MN |       INTEGER            MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|  |       EXTERNAL           LSAME | ||||||
|       REAL               SROUNDUP_LWORK |       REAL               SROUNDUP_LWORK | ||||||
|       EXTERNAL           LSAME, SROUNDUP_LWORK |       EXTERNAL           SROUNDUP_LWORK | ||||||
| *     .. | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           SGEMQRT, SLAMTSQR, XERBLA |       EXTERNAL           SGEMQRT, SLAMTSQR, XERBLA | ||||||
|  | @ -206,7 +207,7 @@ | ||||||
| * | * | ||||||
| *     Test the input arguments | *     Test the input arguments | ||||||
| * | * | ||||||
|       LQUERY  = LWORK.EQ.-1 |       LQUERY  = ( LWORK.EQ.-1 ) | ||||||
|       NOTRAN  = LSAME( TRANS, 'N' ) |       NOTRAN  = LSAME( TRANS, 'N' ) | ||||||
|       TRAN    = LSAME( TRANS, 'T' ) |       TRAN    = LSAME( TRANS, 'T' ) | ||||||
|       LEFT    = LSAME( SIDE, 'L' ) |       LEFT    = LSAME( SIDE, 'L' ) | ||||||
|  | @ -221,6 +222,13 @@ | ||||||
|         LW = MB * NB |         LW = MB * NB | ||||||
|         MN = N |         MN = N | ||||||
|       END IF |       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( ( MB.GT.K ) .AND. ( MN.GT.K ) ) THEN | ||||||
|         IF( MOD( MN - K, MB - K ).EQ.0 ) THEN |         IF( MOD( MN - K, MB - K ).EQ.0 ) THEN | ||||||
|  | @ -249,12 +257,12 @@ | ||||||
|         INFO = -9 |         INFO = -9 | ||||||
|       ELSE IF( LDC.LT.MAX( 1, M ) ) THEN |       ELSE IF( LDC.LT.MAX( 1, M ) ) THEN | ||||||
|         INFO = -11 |         INFO = -11 | ||||||
|       ELSE IF( ( LWORK.LT.MAX( 1, LW ) ) .AND. ( .NOT.LQUERY ) ) THEN |       ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN | ||||||
|         INFO = -13 |         INFO = -13 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.EQ.0 ) THEN |       IF( INFO.EQ.0 ) THEN | ||||||
|         WORK( 1 ) = SROUNDUP_LWORK(LW) |         WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -266,7 +274,7 @@ | ||||||
| * | * | ||||||
| *     Quick return if possible | *     Quick return if possible | ||||||
| * | * | ||||||
|       IF( MIN( M, N, K ).EQ.0 ) THEN |       IF( MINMNK.EQ.0 ) THEN | ||||||
|         RETURN |         RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -279,7 +287,7 @@ | ||||||
|      $                 NB, C, LDC, WORK, LWORK, INFO ) |      $                 NB, C, LDC, WORK, LWORK, INFO ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LW) |       WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -88,7 +88,8 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          For optimum performance LWORK >= N*NB, where NB is the | ||||||
| *>          optimal blocksize. | *>          optimal blocksize. | ||||||
| *> | *> | ||||||
|  | @ -189,8 +190,9 @@ | ||||||
|          END IF |          END IF | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |          WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) | ||||||
| * | * | ||||||
|          IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN |          IF( .NOT.LQUERY ) THEN | ||||||
|             INFO = -7 |             IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) ) | ||||||
|  |      $         INFO = -7 | ||||||
|          END IF |          END IF | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -427,7 +427,8 @@ | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          LWORK is INTEGER | ||||||
| *>          The dimension of the array WORK. | *>          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 )), | *>          For optimal performance LWORK >= (2*N + NB*( N+NRHS+1 )), | ||||||
| *>          where NB is the optimal block size for SGEQP3RK returned | *>          where NB is the optimal block size for SGEQP3RK returned | ||||||
| *>          by ILAENV. Minimal block size MINNB=2. | *>          by ILAENV. Minimal block size MINNB=2. | ||||||
|  | @ -618,8 +619,9 @@ | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       LOGICAL            SISNAN |       LOGICAL            SISNAN | ||||||
|       INTEGER            ISAMAX, ILAENV |       INTEGER            ISAMAX, ILAENV | ||||||
|       REAL               SLAMCH, SNRM2 |       REAL               SLAMCH, SNRM2, SROUNDUP_LWORK | ||||||
|       EXTERNAL           SISNAN, SLAMCH, SNRM2, ISAMAX, ILAENV |       EXTERNAL           SISNAN, SLAMCH, SNRM2, ISAMAX, ILAENV, | ||||||
|  |      $                   SROUNDUP_LWORK | ||||||
| *     .. | *     .. | ||||||
| *     .. Intrinsic Functions .. | *     .. Intrinsic Functions .. | ||||||
|       INTRINSIC          REAL, MAX, MIN |       INTRINSIC          REAL, MAX, MIN | ||||||
|  | @ -696,7 +698,7 @@ | ||||||
| * | * | ||||||
|             LWKOPT = 2*N + NB*( N+NRHS+1 ) |             LWKOPT = 2*N + NB*( N+NRHS+1 ) | ||||||
|          END IF |          END IF | ||||||
|          WORK( 1 ) = REAL( LWKOPT ) |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
| * | * | ||||||
|          IF( ( LWORK.LT.IWS ) .AND. .NOT.LQUERY ) THEN |          IF( ( LWORK.LT.IWS ) .AND. .NOT.LQUERY ) THEN | ||||||
|             INFO = -15 |             INFO = -15 | ||||||
|  | @ -719,7 +721,7 @@ | ||||||
|          K = 0 |          K = 0 | ||||||
|          MAXC2NRMK = ZERO |          MAXC2NRMK = ZERO | ||||||
|          RELMAXC2NRMK = ZERO |          RELMAXC2NRMK = ZERO | ||||||
|          WORK( 1 ) = REAL( LWKOPT ) |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -772,7 +774,7 @@ | ||||||
| * | * | ||||||
| *        Array TAU is not set and contains undefined elements. | *        Array TAU is not set and contains undefined elements. | ||||||
| * | * | ||||||
|          WORK( 1 ) = REAL( LWKOPT ) |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -791,7 +793,7 @@ | ||||||
|             TAU( J ) = ZERO |             TAU( J ) = ZERO | ||||||
|          END DO |          END DO | ||||||
| * | * | ||||||
|          WORK( 1 ) = REAL( LWKOPT ) |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|          RETURN |          RETURN | ||||||
| * | * | ||||||
|       END IF |       END IF | ||||||
|  | @ -822,7 +824,7 @@ | ||||||
|          DO J = 1, MINMN |          DO J = 1, MINMN | ||||||
|             TAU( J ) = ZERO |             TAU( J ) = ZERO | ||||||
|          END DO |          END DO | ||||||
|          WORK( 1 ) = REAL( LWKOPT ) |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -867,7 +869,7 @@ | ||||||
|             TAU( J ) = ZERO |             TAU( J ) = ZERO | ||||||
|          END DO |          END DO | ||||||
| * | * | ||||||
|          WORK( 1 ) = REAL( LWKOPT ) |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -985,7 +987,7 @@ | ||||||
| * | * | ||||||
| *              Return from the routine. | *              Return from the routine. | ||||||
| * | * | ||||||
|                WORK( 1 ) = REAL( LWKOPT ) |                WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
| * | * | ||||||
|                RETURN |                RETURN | ||||||
| * | * | ||||||
|  | @ -1072,7 +1074,7 @@ | ||||||
| * | * | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       WORK( 1 ) = REAL( LWKOPT ) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -99,7 +99,7 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          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 | *>          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 | *>          values as the first entries of the T and WORK arrays, and no error | ||||||
|  | @ -168,6 +168,8 @@ | ||||||
| *> | *> | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
|  | *> \ingroup geqr | ||||||
|  | *> | ||||||
| *  ===================================================================== | *  ===================================================================== | ||||||
|       SUBROUTINE SGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK, |       SUBROUTINE SGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK, | ||||||
|      $                  INFO ) |      $                  INFO ) | ||||||
|  | @ -188,11 +190,13 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL            LQUERY, LMINWS, MINT, MINW |       LOGICAL            LQUERY, LMINWS, MINT, MINW | ||||||
|       INTEGER            MB, NB, MINTSZ, NBLCKS |       INTEGER            MB, NB, MINTSZ, NBLCKS, LWMIN, LWREQ | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|       EXTERNAL           LSAME |       EXTERNAL           LSAME | ||||||
|  |       REAL               SROUNDUP_LWORK | ||||||
|  |       EXTERNAL           SROUNDUP_LWORK | ||||||
| *     .. | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           SLATSQR, SGEQRT, XERBLA |       EXTERNAL           SLATSQR, SGEQRT, XERBLA | ||||||
|  | @ -244,8 +248,10 @@ | ||||||
| * | * | ||||||
| *     Determine if the workspace size satisfies minimal size | *     Determine if the workspace size satisfies minimal size | ||||||
| * | * | ||||||
|  |       LWMIN = MAX( 1, N ) | ||||||
|  |       LWREQ = MAX( 1, N*NB ) | ||||||
|       LMINWS = .FALSE. |       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. ( LWORK.GE.N ) .AND. ( TSIZE.GE.MINTSZ ) | ||||||
|      $    .AND. ( .NOT.LQUERY ) ) THEN |      $    .AND. ( .NOT.LQUERY ) ) THEN | ||||||
|         IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) ) THEN |         IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) ) THEN | ||||||
|  | @ -253,7 +259,7 @@ | ||||||
|           NB = 1 |           NB = 1 | ||||||
|           MB = M |           MB = M | ||||||
|         END IF |         END IF | ||||||
|         IF( LWORK.LT.NB*N ) THEN |         IF( LWORK.LT.LWREQ ) THEN | ||||||
|           LMINWS = .TRUE. |           LMINWS = .TRUE. | ||||||
|           NB = 1 |           NB = 1 | ||||||
|         END IF |         END IF | ||||||
|  | @ -268,7 +274,7 @@ | ||||||
|       ELSE IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) |       ELSE IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) | ||||||
|      $   .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN |      $   .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN | ||||||
|         INFO = -6 |         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 |      $   .AND. ( .NOT.LMINWS ) ) THEN | ||||||
|         INFO = -8 |         INFO = -8 | ||||||
|       END IF |       END IF | ||||||
|  | @ -282,9 +288,9 @@ | ||||||
|         T( 2 ) = MB |         T( 2 ) = MB | ||||||
|         T( 3 ) = NB |         T( 3 ) = NB | ||||||
|         IF( MINW ) THEN |         IF( MINW ) THEN | ||||||
|           WORK( 1 ) = MAX( 1, N ) |           WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|         ELSE |         ELSE | ||||||
|           WORK( 1 ) = MAX( 1, NB*N ) |           WORK( 1 ) = SROUNDUP_LWORK( LWREQ ) | ||||||
|         END IF |         END IF | ||||||
|       END IF |       END IF | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -309,7 +315,7 @@ | ||||||
|      $                LWORK, INFO ) |      $                LWORK, INFO ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       WORK( 1 ) = MAX( 1, NB*N ) |       WORK( 1 ) = SROUNDUP_LWORK( LWREQ ) | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -97,7 +97,8 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          For optimum performance LWORK >= N*NB, where NB is | ||||||
| *>          the optimal blocksize. | *>          the optimal blocksize. | ||||||
| *> | *> | ||||||
|  | @ -162,8 +163,8 @@ | ||||||
| * | * | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL            LQUERY |       LOGICAL            LQUERY | ||||||
|       INTEGER            I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB, |       INTEGER            I, IB, IINFO, IWS, K, LDWORK, LWKMIN, LWKOPT, | ||||||
|      $                   NBMIN, NX |      $                   NB, NBMIN, NX | ||||||
| *     .. | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           SGEQR2P, SLARFB, SLARFT, XERBLA |       EXTERNAL           SGEQR2P, SLARFB, SLARFT, XERBLA | ||||||
|  | @ -173,8 +174,9 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       INTEGER            ILAENV |       INTEGER            ILAENV | ||||||
|  |       EXTERNAL           ILAENV | ||||||
|       REAL               SROUNDUP_LWORK |       REAL               SROUNDUP_LWORK | ||||||
|       EXTERNAL           ILAENV, SROUNDUP_LWORK |       EXTERNAL           SROUNDUP_LWORK | ||||||
| *     .. | *     .. | ||||||
| *     .. Executable Statements .. | *     .. Executable Statements .. | ||||||
| * | * | ||||||
|  | @ -182,8 +184,16 @@ | ||||||
| * | * | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       NB = ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 ) |       NB = ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 ) | ||||||
|       LWKOPT = N*NB |       K = MIN( M, N ) | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |       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 ) |       LQUERY = ( LWORK.EQ.-1 ) | ||||||
|       IF( M.LT.0 ) THEN |       IF( M.LT.0 ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|  | @ -191,7 +201,7 @@ | ||||||
|          INFO = -2 |          INFO = -2 | ||||||
|       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN |       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN | ||||||
|          INFO = -4 |          INFO = -4 | ||||||
|       ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN |       ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN | ||||||
|          INFO = -7 |          INFO = -7 | ||||||
|       END IF |       END IF | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -211,7 +221,7 @@ | ||||||
| * | * | ||||||
|       NBMIN = 2 |       NBMIN = 2 | ||||||
|       NX = 0 |       NX = 0 | ||||||
|       IWS = N |       IWS = LWKMIN | ||||||
|       IF( NB.GT.1 .AND. NB.LT.K ) THEN |       IF( NB.GT.1 .AND. NB.LT.K ) THEN | ||||||
| * | * | ||||||
| *        Determine when to cross over from blocked to unblocked code. | *        Determine when to cross over from blocked to unblocked code. | ||||||
|  | @ -273,7 +283,7 @@ | ||||||
|      $   CALL SGEQR2P( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK, |      $   CALL SGEQR2P( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK, | ||||||
|      $                IINFO ) |      $                IINFO ) | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(IWS) |       WORK( 1 ) = SROUNDUP_LWORK( IWS ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SGEQRFP | *     End of SGEQRFP | ||||||
|  |  | ||||||
|  | @ -208,7 +208,7 @@ | ||||||
| *> | *> | ||||||
| *> \param[in,out] WORK | *> \param[in,out] WORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          WORK is REAL array, dimension (LWORK) | *>          WORK is REAL array, dimension (MAX(1,LWORK)) | ||||||
| *>          On entry, | *>          On entry, | ||||||
| *>          If JOBU = 'C' : | *>          If JOBU = 'C' : | ||||||
| *>          WORK(1) = CTOL, where CTOL defines the threshold for convergence. | *>          WORK(1) = CTOL, where CTOL defines the threshold for convergence. | ||||||
|  | @ -239,7 +239,12 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[out] INFO | *> \param[out] INFO | ||||||
|  | @ -260,7 +265,7 @@ | ||||||
| *> \author Univ. of Colorado Denver | *> \author Univ. of Colorado Denver | ||||||
| *> \author NAG Ltd. | *> \author NAG Ltd. | ||||||
| * | * | ||||||
| *> \ingroup realGEcomputational | *> \ingroup gesvj | ||||||
| * | * | ||||||
| *> \par Further Details: | *> \par Further Details: | ||||||
| *  ===================== | *  ===================== | ||||||
|  | @ -351,9 +356,9 @@ | ||||||
|       INTEGER            BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1, |       INTEGER            BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1, | ||||||
|      $                   ISWROT, jbc, jgl, KBL, LKAHEAD, MVL, N2, N34, |      $                   ISWROT, jbc, jgl, KBL, LKAHEAD, MVL, N2, N34, | ||||||
|      $                   N4, NBL, NOTROT, p, PSKIPPED, q, ROWSKIP, |      $                   N4, NBL, NOTROT, p, PSKIPPED, q, ROWSKIP, | ||||||
|      $                   SWBAND |      $                   SWBAND, MINMN, LWMIN | ||||||
|       LOGICAL            APPLV, GOSCALE, LOWER, LSVEC, NOSCALE, ROTOK, |       LOGICAL            APPLV, GOSCALE, LOWER, LQUERY, LSVEC, NOSCALE, | ||||||
|      $                   RSVEC, UCTOL, UPPER |      $                   ROTOK, RSVEC, UCTOL, UPPER | ||||||
| *     .. | *     .. | ||||||
| *     .. Local Arrays .. | *     .. Local Arrays .. | ||||||
|       REAL               FASTR( 5 ) |       REAL               FASTR( 5 ) | ||||||
|  | @ -369,8 +374,8 @@ | ||||||
|       INTEGER            ISAMAX |       INTEGER            ISAMAX | ||||||
|       EXTERNAL           ISAMAX |       EXTERNAL           ISAMAX | ||||||
| *     from LAPACK | *     from LAPACK | ||||||
|       REAL               SLAMCH |       REAL               SLAMCH, SROUNDUP_LWORK | ||||||
|       EXTERNAL           SLAMCH |       EXTERNAL           SLAMCH, SROUNDUP_LWORK | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|       EXTERNAL           LSAME |       EXTERNAL           LSAME | ||||||
| *     .. | *     .. | ||||||
|  | @ -394,6 +399,14 @@ | ||||||
|       UPPER = LSAME( JOBA, 'U' ) |       UPPER = LSAME( JOBA, 'U' ) | ||||||
|       LOWER = LSAME( JOBA, 'L' ) |       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 |       IF( .NOT.( UPPER .OR. LOWER .OR. LSAME( JOBA, 'G' ) ) ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|       ELSE IF( .NOT.( LSVEC .OR. UCTOL .OR. LSAME( JOBU, 'N' ) ) ) THEN |       ELSE IF( .NOT.( LSVEC .OR. UCTOL .OR. LSAME( JOBU, 'N' ) ) ) THEN | ||||||
|  | @ -413,7 +426,7 @@ | ||||||
|          INFO = -11 |          INFO = -11 | ||||||
|       ELSE IF( UCTOL .AND. ( WORK( 1 ).LE.ONE ) ) THEN |       ELSE IF( UCTOL .AND. ( WORK( 1 ).LE.ONE ) ) THEN | ||||||
|          INFO = -12 |          INFO = -12 | ||||||
|       ELSE IF( LWORK.LT.MAX( M+N, 6 ) ) THEN |       ELSE IF( LWORK.LT.LWMIN .AND. ( .NOT.LQUERY ) ) THEN | ||||||
|          INFO = -13 |          INFO = -13 | ||||||
|       ELSE |       ELSE | ||||||
|          INFO = 0 |          INFO = 0 | ||||||
|  | @ -423,11 +436,14 @@ | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|          CALL XERBLA( 'SGESVJ', -INFO ) |          CALL XERBLA( 'SGESVJ', -INFO ) | ||||||
|          RETURN |          RETURN | ||||||
|  |       ELSE IF( LQUERY ) THEN | ||||||
|  |          WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|  |          RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
| * #:) Quick return for void matrix | * #:) Quick return for void matrix | ||||||
| * | * | ||||||
|       IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )RETURN |       IF( MINMN.EQ.0 ) RETURN | ||||||
| * | * | ||||||
| *     Set numerical parameters | *     Set numerical parameters | ||||||
| *     The stopping criterion for Jacobi rotations is | *     The stopping criterion for Jacobi rotations is | ||||||
|  |  | ||||||
|  | @ -137,8 +137,9 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       INTEGER            ILAENV |       INTEGER            ILAENV | ||||||
|  |       EXTERNAL           ILAENV | ||||||
|       REAL               SROUNDUP_LWORK |       REAL               SROUNDUP_LWORK | ||||||
|       EXTERNAL           ILAENV, SROUNDUP_LWORK |       EXTERNAL           SROUNDUP_LWORK | ||||||
| *     .. | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           SGEMM, SGEMV, SSWAP, STRSM, STRTRI, XERBLA |       EXTERNAL           SGEMM, SGEMV, SSWAP, STRSM, STRTRI, XERBLA | ||||||
|  | @ -152,8 +153,9 @@ | ||||||
| * | * | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       NB = ILAENV( 1, 'SGETRI', ' ', N, -1, -1, -1 ) |       NB = ILAENV( 1, 'SGETRI', ' ', N, -1, -1, -1 ) | ||||||
|       LWKOPT = N*NB |       LWKOPT = MAX( 1, N*NB ) | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|  | * | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       LQUERY = ( LWORK.EQ.-1 ) | ||||||
|       IF( N.LT.0 ) THEN |       IF( N.LT.0 ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|  | @ -251,7 +253,7 @@ | ||||||
|      $      CALL SSWAP( N, A( 1, J ), 1, A( 1, JP ), 1 ) |      $      CALL SSWAP( N, A( 1, J ), 1, A( 1, JP ), 1 ) | ||||||
|    60 CONTINUE |    60 CONTINUE | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(IWS) |       WORK( 1 ) = SROUNDUP_LWORK( IWS ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SGETRI | *     End of SGETRI | ||||||
|  |  | ||||||
|  | @ -127,7 +127,7 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 or -2, then a workspace query is assumed. | ||||||
| *>          If LWORK = -1, the routine calculates optimal size of WORK for the | *>          If LWORK = -1, the routine calculates optimal size of WORK for the | ||||||
| *>          optimal performance and returns this value in WORK(1). | *>          optimal performance and returns this value in WORK(1). | ||||||
|  | @ -226,7 +226,10 @@ | ||||||
| * | * | ||||||
| *     Determine the optimum and minimum LWORK | *     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 ) |          CALL SGEQR( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 ) | ||||||
|          TSZO = INT( TQ( 1 ) ) |          TSZO = INT( TQ( 1 ) ) | ||||||
|          LWO  = INT( WORKQ( 1 ) ) |          LWO  = INT( WORKQ( 1 ) ) | ||||||
|  |  | ||||||
|  | @ -130,14 +130,17 @@ | ||||||
| *> | *> | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
|  | *>          LWORK is INTEGER | ||||||
| *>          The dimension of the array WORK. | *>          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 | *>          where | ||||||
| *>             NUM_ALL_ROW_BLOCKS = CEIL((M-N)/(MB1-N)), | *>             NUM_ALL_ROW_BLOCKS = CEIL((M-N)/(MB1-N)), | ||||||
| *>             NB1LOCAL = MIN(NB1,N). | *>             NB1LOCAL = MIN(NB1,N). | ||||||
| *>             LWT = NUM_ALL_ROW_BLOCKS * N * NB1LOCAL, | *>             LWT = NUM_ALL_ROW_BLOCKS * N * NB1LOCAL, | ||||||
| *>             LW1 = NB1LOCAL * N, | *>             LW1 = NB1LOCAL * N, | ||||||
| *>             LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) ), | *>             LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) ). | ||||||
|  | *> | ||||||
| *>          If LWORK = -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 WORK | *>          The routine only calculates the optimal size of the WORK | ||||||
| *>          array, returns this value as the first entry of the WORK | *>          array, returns this value as the first entry of the WORK | ||||||
|  | @ -216,7 +219,7 @@ | ||||||
| *     Test the input arguments | *     Test the input arguments | ||||||
| * | * | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       LQUERY  = LWORK.EQ.-1 |       LQUERY = ( LWORK.EQ.-1 ) | ||||||
|       IF( M.LT.0 ) THEN |       IF( M.LT.0 ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|       ELSE IF( N.LT.0 .OR. M.LT.N ) THEN |       ELSE IF( N.LT.0 .OR. M.LT.N ) THEN | ||||||
|  | @ -229,7 +232,7 @@ | ||||||
|          INFO = -5 |          INFO = -5 | ||||||
|       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN |       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN | ||||||
|          INFO = -7 |          INFO = -7 | ||||||
|       ELSE IF( LDT.LT.MAX( 1,  MIN( NB2, N ) ) ) THEN |       ELSE IF( LDT.LT.MAX( 1, MIN( NB2, N ) ) ) THEN | ||||||
|          INFO = -9 |          INFO = -9 | ||||||
|       ELSE |       ELSE | ||||||
| * | * | ||||||
|  | @ -267,8 +270,9 @@ | ||||||
|             LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) ) |             LW2 = NB1LOCAL * MAX( NB1LOCAL, ( N - NB1LOCAL ) ) | ||||||
| * | * | ||||||
|             LWORKOPT = MAX( LWT + LW1, MAX( LWT+N*N+LW2, LWT+N*N+N ) ) |             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 |                INFO = -11 | ||||||
|             END IF |             END IF | ||||||
| * | * | ||||||
|  | @ -350,4 +354,4 @@ | ||||||
| * | * | ||||||
| *     End of SGETSQRHRT | *     End of SGETSQRHRT | ||||||
| * | * | ||||||
|       END |       END | ||||||
|  |  | ||||||
|  | @ -234,6 +234,8 @@ | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          LWORK is INTEGER | ||||||
| *>          The dimension of the array WORK. | *>          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 | *>          If LWORK = -1, then a workspace query is assumed; the routine | ||||||
| *>          only calculates the optimal size of the WORK array, returns | *>          only calculates the optimal size of the WORK array, returns | ||||||
|  | @ -309,7 +311,8 @@ | ||||||
|       LOGICAL            CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL, |       LOGICAL            CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL, | ||||||
|      $                   LQUERY, LST2SL, WANTST |      $                   LQUERY, LST2SL, WANTST | ||||||
|       INTEGER            I, ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, |       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, |       REAL               ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PVSL, | ||||||
|      $                   PVSR, SAFMAX, SAFMIN, SMLNUM |      $                   PVSR, SAFMAX, SAFMIN, SMLNUM | ||||||
| *     .. | *     .. | ||||||
|  | @ -361,6 +364,12 @@ | ||||||
| * | * | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       LQUERY = ( LWORK.EQ.-1 ) | ||||||
|  |       IF( N.EQ.0 ) THEN | ||||||
|  |          LWKMIN = 1 | ||||||
|  |       ELSE | ||||||
|  |          LWKMIN = 6*N+16 | ||||||
|  |       END IF | ||||||
|  | * | ||||||
|       IF( IJOBVL.LE.0 ) THEN |       IF( IJOBVL.LE.0 ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|       ELSE IF( IJOBVR.LE.0 ) THEN |       ELSE IF( IJOBVR.LE.0 ) THEN | ||||||
|  | @ -377,7 +386,7 @@ | ||||||
|          INFO = -15 |          INFO = -15 | ||||||
|       ELSE IF( LDVSR.LT.1 .OR. ( ILVSR .AND. LDVSR.LT.N ) ) THEN |       ELSE IF( LDVSR.LT.1 .OR. ( ILVSR .AND. LDVSR.LT.N ) ) THEN | ||||||
|          INFO = -17 |          INFO = -17 | ||||||
|       ELSE IF( LWORK.LT.6*N+16 .AND. .NOT.LQUERY ) THEN |       ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN | ||||||
|          INFO = -19 |          INFO = -19 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -385,7 +394,7 @@ | ||||||
| * | * | ||||||
|       IF( INFO.EQ.0 ) THEN |       IF( INFO.EQ.0 ) THEN | ||||||
|          CALL SGEQRF( N, N, B, LDB, WORK, WORK, -1, IERR ) |          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, |          CALL SORMQR( 'L', 'T', N, N, N, B, LDB, WORK, A, LDA, WORK, | ||||||
|      $                -1, IERR ) |      $                -1, IERR ) | ||||||
|          LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) ) |          LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) ) | ||||||
|  | @ -407,7 +416,11 @@ | ||||||
|      $                   IERR ) |      $                   IERR ) | ||||||
|             LWKOPT = MAX( LWKOPT, 2*N+INT( WORK( 1 ) ) ) |             LWKOPT = MAX( LWKOPT, 2*N+INT( WORK( 1 ) ) ) | ||||||
|          END IF |          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 |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -421,6 +434,7 @@ | ||||||
| * | * | ||||||
|       IF( N.EQ.0 ) THEN |       IF( N.EQ.0 ) THEN | ||||||
|          SDIM = 0 |          SDIM = 0 | ||||||
|  |          WORK( 1 ) = 1 | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -657,7 +671,7 @@ | ||||||
| * | * | ||||||
|    40 CONTINUE |    40 CONTINUE | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -189,6 +189,8 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \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 | *>          If LWORK = -1, then a workspace query is assumed; the routine | ||||||
| *>          only calculates the optimal size of the WORK array, returns | *>          only calculates the optimal size of the WORK array, returns | ||||||
|  | @ -248,7 +250,8 @@ | ||||||
|       LOGICAL            ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY |       LOGICAL            ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY | ||||||
|       CHARACTER          CHTEMP |       CHARACTER          CHTEMP | ||||||
|       INTEGER            ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO, |       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, |       REAL               ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, | ||||||
|      $                   SMLNUM, TEMP |      $                   SMLNUM, TEMP | ||||||
| *     .. | *     .. | ||||||
|  | @ -298,6 +301,7 @@ | ||||||
| * | * | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       LQUERY = ( LWORK.EQ.-1 ) | ||||||
|  |       LWKMIN = MAX( 1, 8*N ) | ||||||
|       IF( IJOBVL.LE.0 ) THEN |       IF( IJOBVL.LE.0 ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|       ELSE IF( IJOBVR.LE.0 ) THEN |       ELSE IF( IJOBVR.LE.0 ) THEN | ||||||
|  | @ -312,7 +316,7 @@ | ||||||
|          INFO = -12 |          INFO = -12 | ||||||
|       ELSE IF( LDVR.LT.1 .OR. ( ILVR .AND. LDVR.LT.N ) ) THEN |       ELSE IF( LDVR.LT.1 .OR. ( ILVR .AND. LDVR.LT.N ) ) THEN | ||||||
|          INFO = -14 |          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 |          INFO = -16 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -320,28 +324,31 @@ | ||||||
| * | * | ||||||
|       IF( INFO.EQ.0 ) THEN |       IF( INFO.EQ.0 ) THEN | ||||||
|          CALL SGEQRF( N, N, B, LDB, WORK, WORK, -1, IERR ) |          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, |          CALL SORMQR( 'L', 'T', N, N, N, B, LDB, WORK, A, LDA, WORK, | ||||||
|      $                -1, IERR ) |      $                -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, |          CALL SGGHD3( JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB, VL, LDVL, | ||||||
|      $                VR, LDVR, WORK, -1, IERR ) |      $                VR, LDVR, WORK, -1, IERR ) | ||||||
|          LWKOPT = MAX( LWKOPT, 3*N+INT ( WORK( 1 ) ) ) |          LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) ) | ||||||
|          IF( ILVL ) THEN |          IF( ILVL ) THEN | ||||||
|             CALL SORGQR( N, N, N, VL, LDVL, WORK, WORK, -1, IERR ) |             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, |             CALL SLAQZ0( 'S', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB, | ||||||
|      $                   ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR, |      $                   ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR, | ||||||
|      $                   WORK, -1, 0, IERR ) |      $                   WORK, -1, 0, IERR ) | ||||||
|             LWKOPT = MAX( LWKOPT, 2*N+INT ( WORK( 1 ) ) ) |             LWKOPT = MAX( LWKOPT, 2*N+INT( WORK( 1 ) ) ) | ||||||
|          ELSE |          ELSE | ||||||
|             CALL SLAQZ0( 'E', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB, |             CALL SLAQZ0( 'E', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB, | ||||||
|      $                   ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR, |      $                   ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR, | ||||||
|      $                   WORK, -1, 0, IERR ) |      $                   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 |          END IF | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) |  | ||||||
| * |  | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  |  | ||||||
|  | @ -179,14 +179,14 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \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. | *>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK. | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[in]  LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          For optimum performance LWORK >= 6*N*NB, where NB is the | ||||||
| *>          optimal blocksize. | *>          optimal blocksize. | ||||||
| *> | *> | ||||||
|  | @ -276,7 +276,12 @@ | ||||||
| * | * | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       NB = ILAENV( 1, 'SGGHD3', ' ', N, ILO, IHI, -1 ) |       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 ) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|       INITQ = LSAME( COMPQ, 'I' ) |       INITQ = LSAME( COMPQ, 'I' ) | ||||||
|       WANTQ = INITQ .OR. LSAME( COMPQ, 'V' ) |       WANTQ = INITQ .OR. LSAME( COMPQ, 'V' ) | ||||||
|  | @ -326,7 +331,6 @@ | ||||||
| * | * | ||||||
| *     Quick return if possible | *     Quick return if possible | ||||||
| * | * | ||||||
|       NH = IHI - ILO + 1 |  | ||||||
|       IF( NH.LE.1 ) THEN |       IF( NH.LE.1 ) THEN | ||||||
|          WORK( 1 ) = ONE |          WORK( 1 ) = ONE | ||||||
|          RETURN |          RETURN | ||||||
|  | @ -886,6 +890,7 @@ | ||||||
|       IF ( JCOL.LT.IHI ) |       IF ( JCOL.LT.IHI ) | ||||||
|      $   CALL SGGHRD( COMPQ2, COMPZ2, N, JCOL, IHI, A, LDA, B, LDB, Q, |      $   CALL SGGHRD( COMPQ2, COMPZ2, N, JCOL, IHI, A, LDA, B, LDB, Q, | ||||||
|      $                LDQ, Z, LDZ, IERR ) |      $                LDQ, Z, LDZ, IERR ) | ||||||
|  | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
|  |  | ||||||
|  | @ -236,8 +236,9 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       INTEGER            ILAENV |       INTEGER            ILAENV | ||||||
|  |       EXTERNAL           ILAENV | ||||||
|       REAL               SROUNDUP_LWORK |       REAL               SROUNDUP_LWORK | ||||||
|       EXTERNAL           ILAENV, SROUNDUP_LWORK |       EXTERNAL           SROUNDUP_LWORK | ||||||
| *     .. | *     .. | ||||||
| *     .. Intrinsic Functions .. | *     .. Intrinsic Functions .. | ||||||
|       INTRINSIC          INT, MAX, MIN |       INTRINSIC          INT, MAX, MIN | ||||||
|  | @ -251,8 +252,9 @@ | ||||||
|       NB2 = ILAENV( 1, 'SGERQF', ' ', N, P, -1, -1 ) |       NB2 = ILAENV( 1, 'SGERQF', ' ', N, P, -1, -1 ) | ||||||
|       NB3 = ILAENV( 1, 'SORMQR', ' ', N, M, P, -1 ) |       NB3 = ILAENV( 1, 'SORMQR', ' ', N, M, P, -1 ) | ||||||
|       NB = MAX( NB1, NB2, NB3 ) |       NB = MAX( NB1, NB2, NB3 ) | ||||||
|       LWKOPT = MAX( N, M, P )*NB |       LWKOPT = MAX( 1, MAX( N, M, P )*NB ) | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|  | * | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       LQUERY = ( LWORK.EQ.-1 ) | ||||||
|       IF( N.LT.0 ) THEN |       IF( N.LT.0 ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|  | @ -289,6 +291,7 @@ | ||||||
| * | * | ||||||
|       CALL SGERQF( N, P, B, LDB, TAUB, WORK, LWORK, INFO ) |       CALL SGERQF( N, P, B, LDB, TAUB, WORK, LWORK, INFO ) | ||||||
|       LWKOPT = MAX( LOPT, INT( WORK( 1 ) ) ) |       LWKOPT = MAX( LOPT, INT( WORK( 1 ) ) ) | ||||||
|  | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
|  |  | ||||||
|  | @ -250,7 +250,7 @@ | ||||||
|       NB2 = ILAENV( 1, 'SGEQRF', ' ', P, N, -1, -1 ) |       NB2 = ILAENV( 1, 'SGEQRF', ' ', P, N, -1, -1 ) | ||||||
|       NB3 = ILAENV( 1, 'SORMRQ', ' ', M, N, P, -1 ) |       NB3 = ILAENV( 1, 'SORMRQ', ' ', M, N, P, -1 ) | ||||||
|       NB = MAX( NB1, NB2, NB3 ) |       NB = MAX( NB1, NB2, NB3 ) | ||||||
|       LWKOPT = MAX( N, M, P)*NB |       LWKOPT = MAX( 1, MAX( N, M, P )*NB ) | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       LQUERY = ( LWORK.EQ.-1 ) | ||||||
|       IF( M.LT.0 ) THEN |       IF( M.LT.0 ) THEN | ||||||
|  |  | ||||||
|  | @ -278,7 +278,7 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          If LWORK = -1, then a workspace query is assumed; the routine | ||||||
| *>          only calculates the optimal size of the WORK array, returns | *>          only calculates the optimal size of the WORK array, returns | ||||||
|  |  | ||||||
|  | @ -227,7 +227,7 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          If LWORK = -1, then a workspace query is assumed; the routine | ||||||
| *>          only calculates the optimal size of the WORK array, returns | *>          only calculates the optimal size of the WORK array, returns | ||||||
|  | @ -300,8 +300,9 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|  |       EXTERNAL           LSAME | ||||||
|       REAL               SROUNDUP_LWORK |       REAL               SROUNDUP_LWORK | ||||||
|       EXTERNAL           LSAME, SROUNDUP_LWORK |       EXTERNAL           SROUNDUP_LWORK | ||||||
| *     .. | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           SGEQP3, SGEQR2, SGERQ2, SLACPY, SLAPMT, |       EXTERNAL           SGEQP3, SGEQR2, SGERQ2, SLACPY, SLAPMT, | ||||||
|  |  | ||||||
|  | @ -127,17 +127,20 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \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 | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          LWORK is INTEGER | ||||||
| *>          The dimension of the array WORK. | *>          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 | *>          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 | *>          this value as the first entry of the WORK array, and no error | ||||||
| *>          message related to LWORK is issued by XERBLA. | *>          message related to LWORK is issued by XERBLA. | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
|  | @ -189,33 +192,38 @@ | ||||||
| *>     SIAM J. Sci. Comput, vol. 34, no. 1, 2012 | *>     SIAM J. Sci. Comput, vol. 34, no. 1, 2012 | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
|  | *> \ingroup lamswlq | ||||||
|  | *> | ||||||
| *  ===================================================================== | *  ===================================================================== | ||||||
|       SUBROUTINE SLAMSWLQ( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T, |       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 computational routine -- | ||||||
| *  -- LAPACK is a software package provided by Univ. of Tennessee,    -- | *  -- LAPACK is a software package provided by Univ. of Tennessee,    -- | ||||||
| *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | ||||||
| * | * | ||||||
| *     .. Scalar Arguments .. | *     .. Scalar Arguments .. | ||||||
|       CHARACTER         SIDE, TRANS |       CHARACTER          SIDE, TRANS | ||||||
|       INTEGER           INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC |       INTEGER            INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC | ||||||
| *     .. | *     .. | ||||||
| *     .. Array Arguments .. | *     .. Array Arguments .. | ||||||
|       REAL              A( LDA, * ), WORK( * ), C(LDC, * ), |       REAL               A( LDA, * ), WORK( * ), C( LDC, * ), | ||||||
|      $      T( LDT, * ) |      $                   T( LDT, * ) | ||||||
| *     .. | *     .. | ||||||
| * | * | ||||||
| * ===================================================================== | * ===================================================================== | ||||||
| * | * | ||||||
| *     .. | *     .. | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL    LEFT, RIGHT, TRAN, NOTRAN, LQUERY |       LOGICAL            LEFT, RIGHT, TRAN, NOTRAN, LQUERY | ||||||
|       INTEGER    I, II, KK, LW, CTR |       INTEGER            I, II, KK, LW, CTR, MINMNK, LWMIN | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|       EXTERNAL           LSAME |       EXTERNAL           LSAME | ||||||
|  |       REAL               SROUNDUP_LWORK | ||||||
|  |       EXTERNAL           SROUNDUP_LWORK | ||||||
|  | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           STPMLQT, SGEMLQT, XERBLA |       EXTERNAL           STPMLQT, SGEMLQT, XERBLA | ||||||
| *     .. | *     .. | ||||||
|  | @ -223,52 +231,60 @@ | ||||||
| * | * | ||||||
| *     Test the input arguments | *     Test the input arguments | ||||||
| * | * | ||||||
|       LQUERY  = LWORK.LT.0 |       LQUERY  = ( LWORK.EQ.-1 ) | ||||||
|       NOTRAN  = LSAME( TRANS, 'N' ) |       NOTRAN  = LSAME( TRANS, 'N' ) | ||||||
|       TRAN    = LSAME( TRANS, 'T' ) |       TRAN    = LSAME( TRANS, 'T' ) | ||||||
|       LEFT    = LSAME( SIDE, 'L' ) |       LEFT    = LSAME( SIDE, 'L' ) | ||||||
|       RIGHT   = LSAME( SIDE, 'R' ) |       RIGHT   = LSAME( SIDE, 'R' ) | ||||||
|       IF (LEFT) THEN |       IF( LEFT ) THEN | ||||||
|         LW = N * MB |         LW = N * MB | ||||||
|       ELSE |       ELSE | ||||||
|         LW = M * MB |         LW = M * MB | ||||||
|       END IF |       END IF | ||||||
|  | * | ||||||
|  |       MINMNK = MIN( M, N, K ) | ||||||
|  |       IF( MINMNK.EQ.0 ) THEN | ||||||
|  |         LWMIN = 1 | ||||||
|  |       ELSE | ||||||
|  |         LWMIN = MAX( 1, LW ) | ||||||
|  |       END IF | ||||||
| * | * | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       IF( .NOT.LEFT .AND. .NOT.RIGHT ) THEN |       IF( .NOT.LEFT .AND. .NOT.RIGHT ) THEN | ||||||
|          INFO = -1 |         INFO = -1 | ||||||
|       ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN |       ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN | ||||||
|          INFO = -2 |         INFO = -2 | ||||||
|       ELSE IF( K.LT.0 ) THEN |       ELSE IF( K.LT.0 ) THEN | ||||||
|         INFO = -5 |         INFO = -5 | ||||||
|       ELSE IF( M.LT.K ) THEN |       ELSE IF( M.LT.K ) THEN | ||||||
|         INFO = -3 |         INFO = -3 | ||||||
|       ELSE IF( N.LT.0 ) THEN |       ELSE IF( N.LT.0 ) THEN | ||||||
|         INFO = -4 |         INFO = -4 | ||||||
|       ELSE IF( K.LT.MB .OR. MB.LT.1) THEN |       ELSE IF( K.LT.MB .OR. MB.LT.1 ) THEN | ||||||
|         INFO = -6 |         INFO = -6 | ||||||
|       ELSE IF( LDA.LT.MAX( 1, K ) ) THEN |       ELSE IF( LDA.LT.MAX( 1, K ) ) THEN | ||||||
|         INFO = -9 |         INFO = -9 | ||||||
|       ELSE IF( LDT.LT.MAX( 1, MB) ) THEN |       ELSE IF( LDT.LT.MAX( 1, MB ) ) THEN | ||||||
|         INFO = -11 |         INFO = -11 | ||||||
|       ELSE IF( LDC.LT.MAX( 1, M ) ) THEN |       ELSE IF( LDC.LT.MAX( 1, M ) ) THEN | ||||||
|          INFO = -13 |         INFO = -13 | ||||||
|       ELSE IF(( LWORK.LT.MAX(1,LW)).AND.(.NOT.LQUERY)) THEN |       ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN | ||||||
|         INFO = -15 |         INFO = -15 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  |       IF( INFO.EQ.0 ) THEN | ||||||
|  |         WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|  |       END IF | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|         CALL XERBLA( 'SLAMSWLQ', -INFO ) |         CALL XERBLA( 'SLAMSWLQ', -INFO ) | ||||||
|         WORK(1) = LW |  | ||||||
|         RETURN |         RETURN | ||||||
|       ELSE IF (LQUERY) THEN |       ELSE IF( LQUERY ) THEN | ||||||
|         WORK(1) = LW |  | ||||||
|         RETURN |         RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
| *     Quick return if possible | *     Quick return if possible | ||||||
| * | * | ||||||
|       IF( MIN(M,N,K).EQ.0 ) THEN |       IF( MINMNK.EQ.0 ) THEN | ||||||
|         RETURN |         RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -402,7 +418,7 @@ | ||||||
| * | * | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       WORK(1) = LW |       WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SLAMSWLQ | *     End of SLAMSWLQ | ||||||
|  |  | ||||||
|  | @ -128,22 +128,24 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \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 | *> \endverbatim | ||||||
|  | *> | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          LWORK is INTEGER | ||||||
| *>          The dimension of the array WORK. | *>          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 | *>          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 | *>          this value as the first entry of the WORK array, and no error | ||||||
| *>          message related to LWORK is issued by XERBLA. | *>          message related to LWORK is issued by XERBLA. | ||||||
| *> |  | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
|  | *> | ||||||
| *> \param[out] INFO | *> \param[out] INFO | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          INFO is INTEGER | *>          INFO is INTEGER | ||||||
|  | @ -191,33 +193,38 @@ | ||||||
| *>     SIAM J. Sci. Comput, vol. 34, no. 1, 2012 | *>     SIAM J. Sci. Comput, vol. 34, no. 1, 2012 | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
|  | *> \ingroup lamtsqr | ||||||
|  | *> | ||||||
| *  ===================================================================== | *  ===================================================================== | ||||||
|       SUBROUTINE SLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T, |       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 computational routine -- | ||||||
| *  -- LAPACK is a software package provided by Univ. of Tennessee,    -- | *  -- LAPACK is a software package provided by Univ. of Tennessee,    -- | ||||||
| *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | ||||||
| * | * | ||||||
| *     .. Scalar Arguments .. | *     .. Scalar Arguments .. | ||||||
|       CHARACTER         SIDE, TRANS |       CHARACTER          SIDE, TRANS | ||||||
|       INTEGER           INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC |       INTEGER            INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC | ||||||
| *     .. | *     .. | ||||||
| *     .. Array Arguments .. | *     .. Array Arguments .. | ||||||
|       REAL              A( LDA, * ), WORK( * ), C(LDC, * ), |       REAL               A( LDA, * ), WORK( * ), C( LDC, * ), | ||||||
|      $                T( LDT, * ) |      $                   T( LDT, * ) | ||||||
| *     .. | *     .. | ||||||
| * | * | ||||||
| * ===================================================================== | * ===================================================================== | ||||||
| * | * | ||||||
| *     .. | *     .. | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL    LEFT, RIGHT, TRAN, NOTRAN, LQUERY |       LOGICAL            LEFT, RIGHT, TRAN, NOTRAN, LQUERY | ||||||
|       INTEGER    I, II, KK, LW, CTR, Q |       INTEGER            I, II, KK, LW, CTR, Q, MINMNK, LWMIN | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|       EXTERNAL           LSAME |       EXTERNAL           LSAME | ||||||
|  |       REAL               SROUNDUP_LWORK | ||||||
|  |       EXTERNAL           SROUNDUP_LWORK | ||||||
|  | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           SGEMQRT, STPMQRT, XERBLA |       EXTERNAL           SGEMQRT, STPMQRT, XERBLA | ||||||
| *     .. | *     .. | ||||||
|  | @ -225,12 +232,13 @@ | ||||||
| * | * | ||||||
| *     Test the input arguments | *     Test the input arguments | ||||||
| * | * | ||||||
|       LQUERY  = LWORK.LT.0 |       INFO = 0 | ||||||
|  |       LQUERY  = ( LWORK.EQ.-1 ) | ||||||
|       NOTRAN  = LSAME( TRANS, 'N' ) |       NOTRAN  = LSAME( TRANS, 'N' ) | ||||||
|       TRAN    = LSAME( TRANS, 'T' ) |       TRAN    = LSAME( TRANS, 'T' ) | ||||||
|       LEFT    = LSAME( SIDE, 'L' ) |       LEFT    = LSAME( SIDE, 'L' ) | ||||||
|       RIGHT   = LSAME( SIDE, 'R' ) |       RIGHT   = LSAME( SIDE, 'R' ) | ||||||
|       IF (LEFT) THEN |       IF( LEFT ) THEN | ||||||
|         LW = N * NB |         LW = N * NB | ||||||
|         Q = M |         Q = M | ||||||
|       ELSE |       ELSE | ||||||
|  | @ -238,11 +246,17 @@ | ||||||
|         Q = N |         Q = N | ||||||
|       END IF |       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 |       IF( .NOT.LEFT .AND. .NOT.RIGHT ) THEN | ||||||
|          INFO = -1 |         INFO = -1 | ||||||
|       ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN |       ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN | ||||||
|          INFO = -2 |         INFO = -2 | ||||||
|       ELSE IF( M.LT.K ) THEN |       ELSE IF( M.LT.K ) THEN | ||||||
|         INFO = -3 |         INFO = -3 | ||||||
|       ELSE IF( N.LT.0 ) THEN |       ELSE IF( N.LT.0 ) THEN | ||||||
|  | @ -253,38 +267,38 @@ | ||||||
|         INFO = -7 |         INFO = -7 | ||||||
|       ELSE IF( LDA.LT.MAX( 1, Q ) ) THEN |       ELSE IF( LDA.LT.MAX( 1, Q ) ) THEN | ||||||
|         INFO = -9 |         INFO = -9 | ||||||
|       ELSE IF( LDT.LT.MAX( 1, NB) ) THEN |       ELSE IF( LDT.LT.MAX( 1, NB ) ) THEN | ||||||
|         INFO = -11 |         INFO = -11 | ||||||
|       ELSE IF( LDC.LT.MAX( 1, M ) ) THEN |       ELSE IF( LDC.LT.MAX( 1, M ) ) THEN | ||||||
|          INFO = -13 |         INFO = -13 | ||||||
|       ELSE IF(( LWORK.LT.MAX(1,LW)).AND.(.NOT.LQUERY)) THEN |       ELSE IF( LWORK.LT.LWMIN. AND. (.NOT.LQUERY) ) THEN | ||||||
|         INFO = -15 |         INFO = -15 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
| *     Determine the block size if it is tall skinny or short and wide |       IF( INFO.EQ.0 ) THEN | ||||||
| * |         WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|       IF( INFO.EQ.0)  THEN |  | ||||||
|           WORK(1) = LW |  | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|         CALL XERBLA( 'SLAMTSQR', -INFO ) |         CALL XERBLA( 'SLAMTSQR', -INFO ) | ||||||
|         RETURN |         RETURN | ||||||
|       ELSE IF (LQUERY) THEN |       ELSE IF( LQUERY ) THEN | ||||||
|        RETURN |         RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
| *     Quick return if possible | *     Quick return if possible | ||||||
| * | * | ||||||
|       IF( MIN(M,N,K).EQ.0 ) THEN |       IF( MINMNK.EQ.0 ) THEN | ||||||
|         RETURN |         RETURN | ||||||
|       END IF |       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 |       IF((MB.LE.K).OR.(MB.GE.MAX(M,N,K))) THEN | ||||||
|         CALL SGEMQRT( SIDE, TRANS, M, N, K, NB, A, LDA, |         CALL SGEMQRT( SIDE, TRANS, M, N, K, NB, A, LDA, | ||||||
|      $        T, LDT, C, LDC, WORK, INFO) |      $        T, LDT, C, LDC, WORK, INFO ) | ||||||
|         RETURN |         RETURN | ||||||
|        END IF |       END IF | ||||||
| * | * | ||||||
|       IF(LEFT.AND.NOTRAN) THEN |       IF(LEFT.AND.NOTRAN) THEN | ||||||
| * | * | ||||||
|  | @ -410,7 +424,7 @@ | ||||||
| * | * | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       WORK(1) = LW |       WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SLAMTSQR | *     End of SLAMTSQR | ||||||
|  |  | ||||||
|  | @ -96,22 +96,24 @@ | ||||||
| *>          The leading dimension of the array T.  LDT >= MB. | *>          The leading dimension of the array T.  LDT >= MB. | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> |  | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \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 | *> \endverbatim | ||||||
|  | *> | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          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 | *>          this value as the first entry of the WORK array, and no error | ||||||
| *>          message related to LWORK is issued by XERBLA. | *>          message related to LWORK is issued by XERBLA. | ||||||
| *> |  | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
|  | 
 | ||||||
| *> \param[out] INFO | *> \param[out] INFO | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          INFO is INTEGER | *>          INFO is INTEGER | ||||||
|  | @ -163,32 +165,35 @@ | ||||||
| *> | *> | ||||||
| *  ===================================================================== | *  ===================================================================== | ||||||
|       SUBROUTINE SLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK, |       SUBROUTINE SLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK, | ||||||
|      $                  INFO) |      $                    INFO ) | ||||||
| * | * | ||||||
| *  -- LAPACK computational routine -- | *  -- LAPACK computational routine -- | ||||||
| *  -- LAPACK is a software package provided by Univ. of Tennessee,    -- | *  -- LAPACK is a software package provided by Univ. of Tennessee,    -- | ||||||
| *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. -- | *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. -- | ||||||
| * | * | ||||||
| *     .. Scalar Arguments .. | *     .. Scalar Arguments .. | ||||||
|       INTEGER           INFO, LDA, M, N, MB, NB, LWORK, LDT |       INTEGER            INFO, LDA, M, N, MB, NB, LWORK, LDT | ||||||
| *     .. | *     .. | ||||||
| *     .. Array Arguments .. | *     .. Array Arguments .. | ||||||
|       REAL              A( LDA, * ), WORK( * ), T( LDT, *) |       REAL               A( LDA, * ), WORK( * ), T( LDT, * ) | ||||||
| *     .. | *     .. | ||||||
| * | * | ||||||
| *  ===================================================================== | *  ===================================================================== | ||||||
| * | * | ||||||
| *     .. | *     .. | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL    LQUERY |       LOGICAL            LQUERY | ||||||
|       INTEGER    I, II, KK, CTR |       INTEGER            I, II, KK, CTR, MINMN, LWMIN | ||||||
| *     .. | *     .. | ||||||
| *     .. EXTERNAL FUNCTIONS .. | *     .. EXTERNAL FUNCTIONS .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|  |       EXTERNAL           LSAME | ||||||
|       REAL               SROUNDUP_LWORK |       REAL               SROUNDUP_LWORK | ||||||
|       EXTERNAL           LSAME, SROUNDUP_LWORK |       EXTERNAL           SROUNDUP_LWORK | ||||||
|  | *     .. | ||||||
| *     .. EXTERNAL SUBROUTINES .. | *     .. EXTERNAL SUBROUTINES .. | ||||||
|       EXTERNAL           SGELQT, SGEQRT, STPLQT, STPQRT, XERBLA |       EXTERNAL           SGELQT, SGEQRT, STPLQT, STPQRT, XERBLA | ||||||
|  | *     .. | ||||||
| *     .. INTRINSIC FUNCTIONS .. | *     .. INTRINSIC FUNCTIONS .. | ||||||
|       INTRINSIC          MAX, MIN, MOD |       INTRINSIC          MAX, MIN, MOD | ||||||
| *     .. | *     .. | ||||||
|  | @ -199,12 +204,19 @@ | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
| * | * | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       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 |       IF( M.LT.0 ) THEN | ||||||
|         INFO = -1 |         INFO = -1 | ||||||
|       ELSE IF( N.LT.0 .OR. N.LT.M ) THEN |       ELSE IF( N.LT.0 .OR. N.LT.M ) THEN | ||||||
|         INFO = -2 |         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 |         INFO = -3 | ||||||
|       ELSE IF( NB.LE.0 ) THEN |       ELSE IF( NB.LE.0 ) THEN | ||||||
|         INFO = -4 |         INFO = -4 | ||||||
|  | @ -212,60 +224,60 @@ | ||||||
|         INFO = -6 |         INFO = -6 | ||||||
|       ELSE IF( LDT.LT.MB ) THEN |       ELSE IF( LDT.LT.MB ) THEN | ||||||
|         INFO = -8 |         INFO = -8 | ||||||
|       ELSE IF( ( LWORK.LT.M*MB) .AND. (.NOT.LQUERY) ) THEN |       ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN | ||||||
|         INFO = -10 |         INFO = -10 | ||||||
|       END IF |       END IF | ||||||
|       IF( INFO.EQ.0)  THEN |       IF( INFO.EQ.0 ) THEN | ||||||
|       WORK(1) = MB*M |         WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|         CALL XERBLA( 'SLASWLQ', -INFO ) |         CALL XERBLA( 'SLASWLQ', -INFO ) | ||||||
|         RETURN |         RETURN | ||||||
|       ELSE IF (LQUERY) THEN |       ELSE IF( LQUERY ) THEN | ||||||
|        RETURN |         RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
| *     Quick return if possible | *     Quick return if possible | ||||||
| * | * | ||||||
|       IF( MIN(M,N).EQ.0 ) THEN |       IF( MINMN.EQ.0 ) THEN | ||||||
|           RETURN |         RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
| *     The LQ Decomposition | *     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 SGELQT( M, N, MB, A, LDA, T, LDT, WORK, INFO) |         CALL SGELQT( M, N, MB, A, LDA, T, LDT, WORK, INFO ) | ||||||
|         RETURN |         RETURN | ||||||
|        END IF |       END IF | ||||||
| * | * | ||||||
|        KK = MOD((N-M),(NB-M)) |       KK = MOD((N-M),(NB-M)) | ||||||
|        II=N-KK+1 |       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) |       CALL SGELQT( M, NB, MB, A(1,1), LDA, T, LDT, WORK, INFO ) | ||||||
|        CTR = 1 |       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 ), |         CALL STPLQT( M, NB-M, 0, MB, A(1,1), LDA, A( 1, I ), | ||||||
|      $                  LDA, T(1, CTR * M + 1), |      $                 LDA, T(1, CTR * M + 1), | ||||||
|      $                  LDT, WORK, INFO ) |      $                 LDT, WORK, INFO ) | ||||||
|          CTR = CTR + 1 |         CTR = CTR + 1 | ||||||
|        END DO |       END DO | ||||||
| * | * | ||||||
| *     Compute the QR factorization of the last block A(1:M,II:N) | *     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 ), |         CALL STPLQT( M, KK, 0, MB, A(1,1), LDA, A( 1, II ), | ||||||
|      $                  LDA, T(1, CTR * M + 1), LDT, |      $                 LDA, T(1, CTR * M + 1), LDT, | ||||||
|      $                  WORK, INFO ) |      $                 WORK, INFO ) | ||||||
|        END IF |       END IF | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(M * MB) |       WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SLASWLQ | *     End of SLASWLQ | ||||||
|  |  | ||||||
|  | @ -151,13 +151,16 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \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 | *>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK. | ||||||
| *>          WORK. |  | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
|  | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          LWORK >= MAX(1, 2*NBA * MAX(NBA, MIN(NRHS, 32)), where | ||||||
| *>          NBA = (N + NB - 1)/NB and NB is the optimal block size. | *>          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 | *>          only calculates the optimal dimensions of the WORK array, returns | ||||||
| *>          this value as the first entry of the WORK array, and no error | *>          this value as the first entry of the WORK array, and no error | ||||||
| *>          message related to LWORK is issued by XERBLA. | *>          message related to LWORK is issued by XERBLA. | ||||||
|  | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[out] INFO | *> \param[out] INFO | ||||||
| *> \verbatim | *> \verbatim | ||||||
|  | @ -181,7 +185,7 @@ | ||||||
| *> \author Univ. of Colorado Denver | *> \author Univ. of Colorado Denver | ||||||
| *> \author NAG Ltd. | *> \author NAG Ltd. | ||||||
| * | * | ||||||
| *> \ingroup doubleOTHERauxiliary | *> \ingroup latrs3 | ||||||
| *> \par Further Details: | *> \par Further Details: | ||||||
| *  ===================== | *  ===================== | ||||||
| *  \verbatim | *  \verbatim | ||||||
|  | @ -253,7 +257,7 @@ | ||||||
|       LOGICAL            LQUERY, NOTRAN, NOUNIT, UPPER |       LOGICAL            LQUERY, NOTRAN, NOUNIT, UPPER | ||||||
|       INTEGER            AWRK, I, IFIRST, IINC, ILAST, II, I1, I2, J, |       INTEGER            AWRK, I, IFIRST, IINC, ILAST, II, I1, I2, J, | ||||||
|      $                   JFIRST, JINC, JLAST, J1, J2, K, KK, K1, K2, |      $                   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, |       REAL               ANRM, BIGNUM, BNRM, RSCAL, SCAL, SCALOC, | ||||||
|      $                   SCAMIN, SMLNUM, TMAX |      $                   SCAMIN, SMLNUM, TMAX | ||||||
| *     .. | *     .. | ||||||
|  | @ -264,7 +268,8 @@ | ||||||
|       EXTERNAL           ILAENV, LSAME, SLAMCH, SLANGE, SLARMM |       EXTERNAL           ILAENV, LSAME, SLAMCH, SLANGE, SLARMM | ||||||
| *     .. | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           SLATRS, SSCAL, XERBLA |       REAL               SROUNDUP_LWORK | ||||||
|  |       EXTERNAL           SLATRS, SSCAL, SROUNDUP_LWORK, XERBLA | ||||||
| *     .. | *     .. | ||||||
| *     .. Intrinsic Functions .. | *     .. Intrinsic Functions .. | ||||||
|       INTRINSIC          ABS, MAX, MIN |       INTRINSIC          ABS, MAX, MIN | ||||||
|  | @ -292,15 +297,24 @@ | ||||||
| *     row. WORK( I + KK * LDS ) is the scale factor of the vector | *     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 | *     segment associated with the I-th block row and the KK-th vector | ||||||
| *     in the block column. | *     in the block column. | ||||||
|  | * | ||||||
|       LSCALE = NBA * MAX( NBA, MIN( NRHS, NBRHS ) ) |       LSCALE = NBA * MAX( NBA, MIN( NRHS, NBRHS ) ) | ||||||
|       LDS = NBA |       LDS = NBA | ||||||
|  | * | ||||||
| *     The second part stores upper bounds of the triangular A. There are | *     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 | *     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 | *     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 ). | *     the block A( I, J ) is stored as WORK( AWRK + I + J * NBA ). | ||||||
|  | * | ||||||
|       LANRM = NBA * NBA |       LANRM = NBA * NBA | ||||||
|       AWRK = LSCALE |       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. | *     Test the input parameters. | ||||||
| * | * | ||||||
|  | @ -322,7 +336,7 @@ | ||||||
|          INFO = -8 |          INFO = -8 | ||||||
|       ELSE IF( LDX.LT.MAX( 1, N ) ) THEN |       ELSE IF( LDX.LT.MAX( 1, N ) ) THEN | ||||||
|          INFO = -10 |          INFO = -10 | ||||||
|       ELSE IF( .NOT.LQUERY .AND. LWORK.LT.WORK( 1 ) ) THEN |       ELSE IF( .NOT.LQUERY .AND. LWORK.LT.LWMIN ) THEN | ||||||
|          INFO = -14 |          INFO = -14 | ||||||
|       END IF |       END IF | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -650,6 +664,8 @@ | ||||||
|          END DO |          END DO | ||||||
|       END DO |       END DO | ||||||
|       RETURN |       RETURN | ||||||
|  | * | ||||||
|  |       WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
| * | * | ||||||
| *     End of SLATRS3 | *     End of SLATRS3 | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -101,15 +101,18 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \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 | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          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 | *>          this value as the first entry of the WORK array, and no error | ||||||
| *>          message related to LWORK is issued by XERBLA. | *>          message related to LWORK is issued by XERBLA. | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
|  | @ -161,33 +164,39 @@ | ||||||
| *>     SIAM J. Sci. Comput, vol. 34, no. 1, 2012 | *>     SIAM J. Sci. Comput, vol. 34, no. 1, 2012 | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
|  | *> \ingroup latsqr | ||||||
|  | *> | ||||||
| *  ===================================================================== | *  ===================================================================== | ||||||
|       SUBROUTINE SLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK, |       SUBROUTINE SLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK, | ||||||
|      $                    LWORK, INFO) |      $                    LWORK, INFO ) | ||||||
| * | * | ||||||
| *  -- LAPACK computational routine -- | *  -- LAPACK computational routine -- | ||||||
| *  -- LAPACK is a software package provided by Univ. of Tennessee,    -- | *  -- LAPACK is a software package provided by Univ. of Tennessee,    -- | ||||||
| *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. -- | *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. -- | ||||||
| * | * | ||||||
| *     .. Scalar Arguments .. | *     .. Scalar Arguments .. | ||||||
|       INTEGER           INFO, LDA, M, N, MB, NB, LDT, LWORK |       INTEGER            INFO, LDA, M, N, MB, NB, LDT, LWORK | ||||||
| *     .. | *     .. | ||||||
| *     .. Array Arguments .. | *     .. Array Arguments .. | ||||||
|       REAL  A( LDA, * ), WORK( * ), T(LDT, *) |       REAL               A( LDA, * ), WORK( * ), T( LDT, * ) | ||||||
| *     .. | *     .. | ||||||
| * | * | ||||||
| *  ===================================================================== | *  ===================================================================== | ||||||
| * | * | ||||||
| *     .. | *     .. | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL    LQUERY |       LOGICAL            LQUERY | ||||||
|       INTEGER    I, II, KK, CTR |       INTEGER            I, II, KK, CTR, MINMN, LWMIN | ||||||
| *     .. | *     .. | ||||||
| *     .. EXTERNAL FUNCTIONS .. | *     .. EXTERNAL FUNCTIONS .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|       EXTERNAL           LSAME |       EXTERNAL           LSAME | ||||||
|  |       REAL               SROUNDUP_LWORK | ||||||
|  |       EXTERNAL           SROUNDUP_LWORK | ||||||
|  | *     .. | ||||||
| *     .. EXTERNAL SUBROUTINES .. | *     .. EXTERNAL SUBROUTINES .. | ||||||
|       EXTERNAL           SGEQRT, STPQRT, XERBLA |       EXTERNAL           SGEQRT, STPQRT, XERBLA | ||||||
|  | *     .. | ||||||
| *     .. INTRINSIC FUNCTIONS .. | *     .. INTRINSIC FUNCTIONS .. | ||||||
|       INTRINSIC          MAX, MIN, MOD |       INTRINSIC          MAX, MIN, MOD | ||||||
| *     .. | *     .. | ||||||
|  | @ -198,6 +207,13 @@ | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
| * | * | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       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 |       IF( M.LT.0 ) THEN | ||||||
|         INFO = -1 |         INFO = -1 | ||||||
|  | @ -205,64 +221,65 @@ | ||||||
|         INFO = -2 |         INFO = -2 | ||||||
|       ELSE IF( MB.LT.1 ) THEN |       ELSE IF( MB.LT.1 ) THEN | ||||||
|         INFO = -3 |         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 |         INFO = -4 | ||||||
|       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN |       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN | ||||||
|         INFO = -6 |         INFO = -6 | ||||||
|       ELSE IF( LDT.LT.NB ) THEN |       ELSE IF( LDT.LT.NB ) THEN | ||||||
|         INFO = -8 |         INFO = -8 | ||||||
|       ELSE IF( LWORK.LT.(N*NB) .AND. (.NOT.LQUERY) ) THEN |       ELSE IF( LWORK.LT.LWMIN .AND. (.NOT.LQUERY) ) THEN | ||||||
|         INFO = -10 |         INFO = -10 | ||||||
|       END IF |       END IF | ||||||
|       IF( INFO.EQ.0)  THEN | * | ||||||
|         WORK(1) = NB*N |       IF( INFO.EQ.0 )  THEN | ||||||
|  |         WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|       END IF |       END IF | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|         CALL XERBLA( 'SLATSQR', -INFO ) |         CALL XERBLA( 'SLATSQR', -INFO ) | ||||||
|         RETURN |         RETURN | ||||||
|       ELSE IF (LQUERY) THEN |       ELSE IF( LQUERY ) THEN | ||||||
|        RETURN |         RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
| *     Quick return if possible | *     Quick return if possible | ||||||
| * | * | ||||||
|       IF( MIN(M,N).EQ.0 ) THEN |       IF( MINMN.EQ.0 ) THEN | ||||||
|           RETURN |         RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
| *     The QR Decomposition | *     The QR Decomposition | ||||||
| * | * | ||||||
|        IF ((MB.LE.N).OR.(MB.GE.M)) THEN |       IF( (MB.LE.N) .OR. (MB.GE.M) ) THEN | ||||||
|          CALL SGEQRT( M, N, NB, A, LDA, T, LDT, WORK, INFO) |         CALL SGEQRT( M, N, NB, A, LDA, T, LDT, WORK, INFO ) | ||||||
|          RETURN |         RETURN | ||||||
|        END IF |       END IF | ||||||
|        KK = MOD((M-N),(MB-N)) |       KK = MOD((M-N),(MB-N)) | ||||||
|        II=M-KK+1 |       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 |       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 STPQRT( MB-N, N, 0, NB, A(1,1), LDA, A( I, 1 ), LDA, |         CALL STPQRT( MB-N, N, 0, NB, A(1,1), LDA, A( I, 1 ), LDA, | ||||||
|      $                 T(1, CTR * N + 1), |      $                T(1, CTR * N + 1), | ||||||
|      $                  LDT, WORK, INFO ) |      $                LDT, WORK, INFO ) | ||||||
|          CTR = CTR + 1 |         CTR = CTR + 1 | ||||||
|        END DO |       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 |       IF( II.LE.M ) THEN | ||||||
|          CALL STPQRT( KK, N, 0, NB, A(1,1), LDA, A( II, 1 ), LDA, |         CALL STPQRT( KK, N, 0, NB, A(1,1), LDA, A( II, 1 ), LDA, | ||||||
|      $                 T(1, CTR * N + 1), LDT, |      $                T(1, CTR * N + 1), LDT, | ||||||
|      $                  WORK, INFO ) |      $                WORK, INFO ) | ||||||
|        END IF |       END IF | ||||||
| * | * | ||||||
|       work( 1 ) = N*NB |       WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SLATSQR | *     End of SLATSQR | ||||||
|  |  | ||||||
|  | @ -96,8 +96,7 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          WORK is REAL array, | *>          WORK is REAL array, dimension (MAX(1,LWORK)) | ||||||
| *>                                         dimension (LWORK) |  | ||||||
| *>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK. | *>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK. | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
|  | @ -251,7 +250,7 @@ | ||||||
|      $                  N*ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 ) ) |      $                  N*ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 ) ) | ||||||
|             LIOPT = LIWMIN |             LIOPT = LIWMIN | ||||||
|          END IF |          END IF | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LOPT) |          WORK( 1 ) = SROUNDUP_LWORK( LOPT ) | ||||||
|          IWORK( 1 ) = LIOPT |          IWORK( 1 ) = LIOPT | ||||||
| * | * | ||||||
|          IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN |          IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN | ||||||
|  | @ -335,7 +334,7 @@ | ||||||
|       IF( ISCALE.EQ.1 ) |       IF( ISCALE.EQ.1 ) | ||||||
|      $   CALL SSCAL( N, ONE / SIGMA, W, 1 ) |      $   CALL SSCAL( N, ONE / SIGMA, W, 1 ) | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LOPT) |       WORK( 1 ) = SROUNDUP_LWORK( LOPT ) | ||||||
|       IWORK( 1 ) = LIOPT |       IWORK( 1 ) = LIOPT | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
|  |  | ||||||
|  | @ -271,7 +271,8 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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, | *>          For optimal efficiency, LWORK >= (NB+6)*N, | ||||||
| *>          where NB is the max of the blocksize for SSYTRD and SORMTR | *>          where NB is the max of the blocksize for SSYTRD and SORMTR | ||||||
| *>          returned by ILAENV. | *>          returned by ILAENV. | ||||||
|  | @ -292,7 +293,8 @@ | ||||||
| *> \param[in] LIWORK | *> \param[in] LIWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LIWORK is INTEGER | *>          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 | *>          If LIWORK = -1, then a workspace query is assumed; the | ||||||
| *>          routine only calculates the optimal sizes of the WORK and | *>          routine only calculates the optimal sizes of the WORK and | ||||||
|  | @ -392,8 +394,13 @@ | ||||||
| * | * | ||||||
|       LQUERY = ( ( LWORK.EQ.-1 ) .OR. ( LIWORK.EQ.-1 ) ) |       LQUERY = ( ( LWORK.EQ.-1 ) .OR. ( LIWORK.EQ.-1 ) ) | ||||||
| * | * | ||||||
|       LWMIN = MAX( 1, 26*N ) |       IF( N.LE.1 ) THEN | ||||||
|       LIWMIN = MAX( 1, 10*N ) |          LWMIN  = 1 | ||||||
|  |          LIWMIN = 1 | ||||||
|  |       ELSE | ||||||
|  |          LWMIN  = 26*N | ||||||
|  |          LIWMIN = 10*N | ||||||
|  |       END IF | ||||||
| * | * | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN |       IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN | ||||||
|  | @ -428,7 +435,7 @@ | ||||||
|          NB = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 ) |          NB = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 ) | ||||||
|          NB = MAX( NB, ILAENV( 1, 'SORMTR', UPLO, N, -1, -1, -1 ) ) |          NB = MAX( NB, ILAENV( 1, 'SORMTR', UPLO, N, -1, -1, -1 ) ) | ||||||
|          LWKOPT = MAX( ( NB+1 )*N, LWMIN ) |          LWKOPT = MAX( ( NB+1 )*N, LWMIN ) | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|          IWORK( 1 ) = LIWMIN |          IWORK( 1 ) = LIWMIN | ||||||
| * | * | ||||||
|          IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN |          IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN | ||||||
|  | @ -677,7 +684,7 @@ | ||||||
| * | * | ||||||
| *     Set WORK(1) to optimal workspace size. | *     Set WORK(1) to optimal workspace size. | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|       IWORK( 1 ) = LIWMIN |       IWORK( 1 ) = LIWMIN | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
|  |  | ||||||
|  | @ -278,6 +278,7 @@ | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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. | *>          If JOBZ = 'N' and N > 1, LWORK must be queried. | ||||||
| *>                                   LWORK = MAX(1, 26*N, dimension) where | *>                                   LWORK = MAX(1, 26*N, dimension) where | ||||||
| *>                                   dimension = max(stage1,stage2) + (KD+1)*N + 5*N | *>                                   dimension = max(stage1,stage2) + (KD+1)*N + 5*N | ||||||
|  | @ -300,13 +301,14 @@ | ||||||
| *> \param[out] IWORK | *> \param[out] IWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          IWORK is INTEGER array, dimension (MAX(1,LIWORK)) | *>          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 | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[in] LIWORK | *> \param[in] LIWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LIWORK is INTEGER | *>          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 | *>          If LIWORK = -1, then a workspace query is assumed; the | ||||||
| *>          routine only calculates the optimal size of the IWORK array, | *>          routine only calculates the optimal size of the IWORK array, | ||||||
|  | @ -445,8 +447,14 @@ | ||||||
|       IB     = ILAENV2STAGE( 2, 'SSYTRD_2STAGE', JOBZ, N, KD, -1, -1 ) |       IB     = ILAENV2STAGE( 2, 'SSYTRD_2STAGE', JOBZ, N, KD, -1, -1 ) | ||||||
|       LHTRD  = ILAENV2STAGE( 3, 'SSYTRD_2STAGE', JOBZ, N, KD, IB, -1 ) |       LHTRD  = ILAENV2STAGE( 3, 'SSYTRD_2STAGE', JOBZ, N, KD, IB, -1 ) | ||||||
|       LWTRD  = ILAENV2STAGE( 4, '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 |       INFO = 0 | ||||||
|       IF( .NOT.( LSAME( JOBZ, 'N' ) ) ) THEN |       IF( .NOT.( LSAME( JOBZ, 'N' ) ) ) THEN | ||||||
|  | @ -485,7 +493,7 @@ | ||||||
| *         NB = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 ) | *         NB = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 ) | ||||||
| *         NB = MAX( NB, ILAENV( 1, 'SORMTR', UPLO, N, -1, -1, -1 ) ) | *         NB = MAX( NB, ILAENV( 1, 'SORMTR', UPLO, N, -1, -1, -1 ) ) | ||||||
| *         LWKOPT = MAX( ( NB+1 )*N, LWMIN ) | *         LWKOPT = MAX( ( NB+1 )*N, LWMIN ) | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LWMIN) |          WORK( 1 )  = SROUNDUP_LWORK( LWMIN ) | ||||||
|          IWORK( 1 ) = LIWMIN |          IWORK( 1 ) = LIWMIN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -505,7 +513,7 @@ | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( N.EQ.1 ) THEN |       IF( N.EQ.1 ) THEN | ||||||
|          WORK( 1 ) = 26 |          WORK( 1 ) = 1 | ||||||
|          IF( ALLEIG .OR. INDEIG ) THEN |          IF( ALLEIG .OR. INDEIG ) THEN | ||||||
|             M = 1 |             M = 1 | ||||||
|             W( 1 ) = A( 1, 1 ) |             W( 1 ) = A( 1, 1 ) | ||||||
|  | @ -733,7 +741,7 @@ | ||||||
| * | * | ||||||
| *     Set WORK(1) to optimal workspace size. | *     Set WORK(1) to optimal workspace size. | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWMIN) |       WORK( 1 )  = SROUNDUP_LWORK( LWMIN ) | ||||||
|       IWORK( 1 ) = LIWMIN |       IWORK( 1 ) = LIWMIN | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
|  |  | ||||||
|  | @ -338,14 +338,14 @@ | ||||||
|       IF( INFO.EQ.0 ) THEN |       IF( INFO.EQ.0 ) THEN | ||||||
|          IF( N.LE.1 ) THEN |          IF( N.LE.1 ) THEN | ||||||
|             LWKMIN = 1 |             LWKMIN = 1 | ||||||
|             WORK( 1 ) = SROUNDUP_LWORK(LWKMIN) |             LWKOPT = 1 | ||||||
|          ELSE |          ELSE | ||||||
|             LWKMIN = 8*N |             LWKMIN = 8*N | ||||||
|             NB = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 ) |             NB = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 ) | ||||||
|             NB = MAX( NB, ILAENV( 1, 'SORMTR', UPLO, N, -1, -1, -1 ) ) |             NB = MAX( NB, ILAENV( 1, 'SORMTR', UPLO, N, -1, -1, -1 ) ) | ||||||
|             LWKOPT = MAX( LWKMIN, ( NB + 3 )*N ) |             LWKOPT = MAX( LWKMIN, ( NB + 3 )*N ) | ||||||
|             WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |  | ||||||
|          END IF |          END IF | ||||||
|  |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
| * | * | ||||||
|          IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) |          IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) | ||||||
|      $      INFO = -17 |      $      INFO = -17 | ||||||
|  | @ -542,7 +542,7 @@ | ||||||
| * | * | ||||||
| *     Set WORK(1) to optimal workspace size. | *     Set WORK(1) to optimal workspace size. | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -177,12 +177,13 @@ | ||||||
| * | * | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL            LQUERY |       LOGICAL            LQUERY | ||||||
|       INTEGER            LWKOPT, LWKOPT_SYTRF, LWKOPT_SYTRS |       INTEGER            LWKMIN, LWKOPT, LWKOPT_SYTRF, LWKOPT_SYTRS | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|  |       EXTERNAL           LSAME | ||||||
|       REAL               SROUNDUP_LWORK |       REAL               SROUNDUP_LWORK | ||||||
|       EXTERNAL           LSAME, SROUNDUP_LWORK |       EXTERNAL           SROUNDUP_LWORK | ||||||
| *     .. | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           XERBLA, SSYTRS_AA, SSYTRF_AA |       EXTERNAL           XERBLA, SSYTRS_AA, SSYTRF_AA | ||||||
|  | @ -196,6 +197,7 @@ | ||||||
| * | * | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       LQUERY = ( LWORK.EQ.-1 ) | ||||||
|  |       LWKMIN = MAX( 1, 2*N, 3*N-2 ) | ||||||
|       IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN |       IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|       ELSE IF( N.LT.0 ) THEN |       ELSE IF( N.LT.0 ) THEN | ||||||
|  | @ -206,18 +208,18 @@ | ||||||
|          INFO = -5 |          INFO = -5 | ||||||
|       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN |       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN | ||||||
|          INFO = -8 |          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 |          INFO = -10 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.EQ.0 ) THEN |       IF( INFO.EQ.0 ) THEN | ||||||
|          CALL SSYTRF_AA( UPLO, N, A, LDA, IPIV, WORK, -1, INFO ) |          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, |          CALL SSYTRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK, | ||||||
|      $                   -1, INFO ) |      $                   -1, INFO ) | ||||||
|          LWKOPT_SYTRS = INT( WORK(1) ) |          LWKOPT_SYTRS = INT( WORK( 1 ) ) | ||||||
|          LWKOPT = MAX( LWKOPT_SYTRF, LWKOPT_SYTRS ) |          LWKOPT = MAX( LWKMIN, LWKOPT_SYTRF, LWKOPT_SYTRS ) | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -239,7 +241,7 @@ | ||||||
| * | * | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -100,14 +100,14 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] TB | *> \param[out] TB | ||||||
| *> \verbatim | *> \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. | *>          On exit, details of the LU factorization of the band matrix. | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[in] LTB | *> \param[in] LTB | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LTB is INTEGER | *>          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. | *>          used to select NB such that LTB >= (3*NB+1)*N. | ||||||
| *> | *> | ||||||
| *>          If LTB = -1, then a workspace query is assumed; the | *>          If LTB = -1, then a workspace query is assumed; the | ||||||
|  | @ -147,14 +147,15 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \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 | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          LWORK is INTEGER | ||||||
| *>          The size of WORK. LWORK >= N, internally used to select NB | *>          The size of WORK. LWORK >= MAX(1,N), internally used to | ||||||
| *>          such that LWORK >= N*NB. | *>          select NB such that LWORK >= N*NB. | ||||||
| *> | *> | ||||||
| *>          If LWORK = -1, then a workspace query is assumed; the | *>          If LWORK = -1, then a workspace query is assumed; the | ||||||
| *>          routine only calculates the optimal size of the WORK array, | *>          routine only calculates the optimal size of the WORK array, | ||||||
|  | @ -204,12 +205,13 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL            UPPER, TQUERY, WQUERY |       LOGICAL            UPPER, TQUERY, WQUERY | ||||||
|       INTEGER            LWKOPT |       INTEGER            LWKMIN, LWKOPT | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|  |       EXTERNAL           LSAME | ||||||
|       REAL               SROUNDUP_LWORK |       REAL               SROUNDUP_LWORK | ||||||
|       EXTERNAL           LSAME, SROUNDUP_LWORK |       EXTERNAL           SROUNDUP_LWORK | ||||||
| *     .. | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           SSYTRF_AA_2STAGE, SSYTRS_AA_2STAGE, |       EXTERNAL           SSYTRF_AA_2STAGE, SSYTRS_AA_2STAGE, | ||||||
|  | @ -226,6 +228,7 @@ | ||||||
|       UPPER = LSAME( UPLO, 'U' ) |       UPPER = LSAME( UPLO, 'U' ) | ||||||
|       WQUERY = ( LWORK.EQ.-1 ) |       WQUERY = ( LWORK.EQ.-1 ) | ||||||
|       TQUERY = ( LTB.EQ.-1 ) |       TQUERY = ( LTB.EQ.-1 ) | ||||||
|  |       LWKMIN = MAX( 1, N ) | ||||||
|       IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN |       IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|       ELSE IF( N.LT.0 ) THEN |       ELSE IF( N.LT.0 ) THEN | ||||||
|  | @ -234,18 +237,19 @@ | ||||||
|          INFO = -3 |          INFO = -3 | ||||||
|       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN |       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN | ||||||
|          INFO = -5 |          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 |          INFO = -7 | ||||||
|       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN |       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN | ||||||
|          INFO = -11 |          INFO = -11 | ||||||
|       ELSE IF( LWORK.LT.N .AND. .NOT.WQUERY ) THEN |       ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.WQUERY ) THEN | ||||||
|          INFO = -13 |          INFO = -13 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.EQ.0 ) THEN |       IF( INFO.EQ.0 ) THEN | ||||||
|          CALL SSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, -1, IPIV, |          CALL SSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, -1, IPIV, | ||||||
|      $                          IPIV2, WORK, -1, INFO ) |      $                          IPIV2, WORK, -1, INFO ) | ||||||
|          LWKOPT = INT( WORK(1) ) |          LWKOPT = MAX( LWKMIN, INT( WORK( 1 ) ) ) | ||||||
|  |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -255,7 +259,6 @@ | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
| * |  | ||||||
| *     Compute the factorization A = U**T*T*U or A = L*T*L**T. | *     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, |       CALL SSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV, IPIV2, | ||||||
|  | @ -269,7 +272,7 @@ | ||||||
| * | * | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -305,7 +305,7 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL            LQUERY, NOFACT |       LOGICAL            LQUERY, NOFACT | ||||||
|       INTEGER            LWKOPT, NB |       INTEGER            LWKMIN, LWKOPT, NB | ||||||
|       REAL               ANORM |       REAL               ANORM | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|  | @ -327,6 +327,7 @@ | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       NOFACT = LSAME( FACT, 'N' ) |       NOFACT = LSAME( FACT, 'N' ) | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       LQUERY = ( LWORK.EQ.-1 ) | ||||||
|  |       LWKMIN = MAX( 1, 3*N ) | ||||||
|       IF( .NOT.NOFACT .AND. .NOT.LSAME( FACT, 'F' ) ) THEN |       IF( .NOT.NOFACT .AND. .NOT.LSAME( FACT, 'F' ) ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|       ELSE IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) |       ELSE IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) | ||||||
|  | @ -344,12 +345,12 @@ | ||||||
|          INFO = -11 |          INFO = -11 | ||||||
|       ELSE IF( LDX.LT.MAX( 1, N ) ) THEN |       ELSE IF( LDX.LT.MAX( 1, N ) ) THEN | ||||||
|          INFO = -13 |          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 |          INFO = -18 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.EQ.0 ) THEN |       IF( INFO.EQ.0 ) THEN | ||||||
|          LWKOPT = MAX( 1, 3*N ) |          LWKOPT = LWKMIN | ||||||
|          IF( NOFACT ) THEN |          IF( NOFACT ) THEN | ||||||
|             NB = ILAENV( 1, 'SSYTRF', UPLO, N, -1, -1, -1 ) |             NB = ILAENV( 1, 'SSYTRF', UPLO, N, -1, -1, -1 ) | ||||||
|             LWKOPT = MAX( LWKOPT, N*NB ) |             LWKOPT = MAX( LWKOPT, N*NB ) | ||||||
|  |  | ||||||
|  | @ -4,23 +4,23 @@ | ||||||
| * | * | ||||||
| *  =========== DOCUMENTATION =========== | *  =========== DOCUMENTATION =========== | ||||||
| * | * | ||||||
| * Online html documentation available at  | * Online html documentation available at | ||||||
| *            http://www.netlib.org/lapack/explore-html/  | *            http://www.netlib.org/lapack/explore-html/ | ||||||
| * | * | ||||||
| *> \htmlonly | *> \htmlonly | ||||||
| *> Download SSYTRD_2STAGE + dependencies  | *> Download SSYTRD_2STAGE + dependencies | ||||||
| *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ssytrd_2stage.f">  | *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ssytrd_2stage.f"> | ||||||
| *> [TGZ]</a>  | *> [TGZ]</a> | ||||||
| *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ssytrd_2stage.f">  | *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ssytrd_2stage.f"> | ||||||
| *> [ZIP]</a>  | *> [ZIP]</a> | ||||||
| *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ssytrd_2stage.f">  | *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ssytrd_2stage.f"> | ||||||
| *> [TXT]</a> | *> [TXT]</a> | ||||||
| *> \endhtmlonly  | *> \endhtmlonly | ||||||
| * | * | ||||||
| *  Definition: | *  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 ) | *                                 HOUS2, LHOUS2, WORK, LWORK, INFO ) | ||||||
| * | * | ||||||
| *       IMPLICIT NONE | *       IMPLICIT NONE | ||||||
|  | @ -34,7 +34,7 @@ | ||||||
| *       REAL               A( LDA, * ), TAU( * ), | *       REAL               A( LDA, * ), TAU( * ), | ||||||
| *                          HOUS2( * ), WORK( * ) | *                          HOUS2( * ), WORK( * ) | ||||||
| *       .. | *       .. | ||||||
| *   | * | ||||||
| * | * | ||||||
| *> \par Purpose: | *> \par Purpose: | ||||||
| *  ============= | *  ============= | ||||||
|  | @ -52,11 +52,11 @@ | ||||||
| *> \param[in] VECT | *> \param[in] VECT | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          VECT is CHARACTER*1 | *>          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 | *>                  in particular for the second stage (Band to | ||||||
| *>                  tridiagonal) and thus LHOUS2 is of size max(1, 4*N); | *>                  tridiagonal) and thus LHOUS2 is of size max(1, 4*N); | ||||||
| *>          = 'V':  the Householder representation is needed to  | *>          = 'V':  the Householder representation is needed to | ||||||
| *>                  either generate Q1 Q2 or to apply Q1 Q2,  | *>                  either generate Q1 Q2 or to apply Q1 Q2, | ||||||
| *>                  then LHOUS2 is to be queried and computed. | *>                  then LHOUS2 is to be queried and computed. | ||||||
| *>                  (NOT AVAILABLE IN THIS RELEASE). | *>                  (NOT AVAILABLE IN THIS RELEASE). | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
|  | @ -86,7 +86,7 @@ | ||||||
| *>          triangular part of A is not referenced. | *>          triangular part of A is not referenced. | ||||||
| *>          On exit, if UPLO = 'U', the band superdiagonal | *>          On exit, if UPLO = 'U', the band superdiagonal | ||||||
| *>          of A are overwritten by the corresponding elements of the | *>          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 | *>          the KD superdiagonal, with the array TAU, represent the orthogonal | ||||||
| *>          matrix Q1 as a product of elementary reflectors; if UPLO | *>          matrix Q1 as a product of elementary reflectors; if UPLO | ||||||
| *>          = 'L', the diagonal and band subdiagonal of A are over- | *>          = 'L', the diagonal and band subdiagonal of A are over- | ||||||
|  | @ -117,13 +117,13 @@ | ||||||
| *> \param[out] TAU | *> \param[out] TAU | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          TAU is REAL array, dimension (N-KD) | *>          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). | *>          the first stage (see Further Details). | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[out] HOUS2 | *> \param[out] HOUS2 | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          HOUS2 is REAL array, dimension (LHOUS2) | *>          HOUS2 is REAL array, dimension (MAX(1,LHOUS2)) | ||||||
| *>          Stores the Householder representation of the stage2 | *>          Stores the Householder representation of the stage2 | ||||||
| *>          band to tridiagonal. | *>          band to tridiagonal. | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
|  | @ -132,6 +132,8 @@ | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LHOUS2 is INTEGER | *>          LHOUS2 is INTEGER | ||||||
| *>          The dimension of the array HOUS2. | *>          The dimension of the array HOUS2. | ||||||
|  | *>          LHOUS2 >= 1. | ||||||
|  | *> | ||||||
| *>          If LWORK = -1, or LHOUS2 = -1, | *>          If LWORK = -1, or LHOUS2 = -1, | ||||||
| *>          then a query is assumed; the routine | *>          then a query is assumed; the routine | ||||||
| *>          only calculates the optimal size of the HOUS2 array, returns | *>          only calculates the optimal size of the HOUS2 array, returns | ||||||
|  | @ -149,17 +151,19 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          LWORK is INTEGER | ||||||
| *>          The dimension of the array WORK. LWORK = MAX(1, dimension) | *>          The dimension of the array WORK. | ||||||
| *>          If LWORK = -1, or LHOUS2=-1, | *>          If N = 0, LWORK >= 1, else LWORK = MAX(1, dimension). | ||||||
|  | *> | ||||||
|  | *>          If LWORK = -1, or LHOUS2 = -1, | ||||||
| *>          then a workspace query is assumed; the routine | *>          then a workspace query is assumed; the routine | ||||||
| *>          only calculates the optimal size of the WORK array, returns | *>          only calculates the optimal size of the WORK array, returns | ||||||
| *>          this value as the first entry of the WORK array, and no error | *>          this value as the first entry of the WORK array, and no error | ||||||
| *>          message related to LWORK is issued by XERBLA. | *>          message related to LWORK is issued by XERBLA. | ||||||
| *>          LWORK = MAX(1, dimension) where | *>          LWORK = MAX(1, dimension) where | ||||||
| *>          dimension   = max(stage1,stage2) + (KD+1)*N | *>          dimension   = max(stage1,stage2) + (KD+1)*N | ||||||
| *>                      = N*KD + N*max(KD+1,FACTOPTNB)  | *>                      = N*KD + N*max(KD+1,FACTOPTNB) | ||||||
| *>                        + max(2*KD*KD, KD*NTHREADS)  | *>                        + max(2*KD*KD, KD*NTHREADS) | ||||||
| *>                        + (KD+1)*N  | *>                        + (KD+1)*N | ||||||
| *>          where KD is the blocking size of the reduction, | *>          where KD is the blocking size of the reduction, | ||||||
| *>          FACTOPTNB is the blocking used by the QR or LQ | *>          FACTOPTNB is the blocking used by the QR or LQ | ||||||
| *>          algorithm, usually FACTOPTNB=128 is a good choice | *>          algorithm, usually FACTOPTNB=128 is a good choice | ||||||
|  | @ -177,12 +181,12 @@ | ||||||
| *  Authors: | *  Authors: | ||||||
| *  ======== | *  ======== | ||||||
| * | * | ||||||
| *> \author Univ. of Tennessee  | *> \author Univ. of Tennessee | ||||||
| *> \author Univ. of California Berkeley  | *> \author Univ. of California Berkeley | ||||||
| *> \author Univ. of Colorado Denver  | *> \author Univ. of Colorado Denver | ||||||
| *> \author NAG Ltd.  | *> \author NAG Ltd. | ||||||
| * | * | ||||||
| *> \ingroup realSYcomputational | *> \ingroup hetrd_2stage | ||||||
| * | * | ||||||
| *> \par Further Details: | *> \par Further Details: | ||||||
| *  ===================== | *  ===================== | ||||||
|  | @ -202,7 +206,7 @@ | ||||||
| *>  http://doi.acm.org/10.1145/2063384.2063394 | *>  http://doi.acm.org/10.1145/2063384.2063394 | ||||||
| *> | *> | ||||||
| *>  A. Haidar, J. Kurzak, P. Luszczek, 2013. | *>  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 multicore hardware, In Proceedings of 2013 International Conference | ||||||
| *>  for High Performance Computing, Networking, Storage and Analysis (SC '13). | *>  for High Performance Computing, Networking, Storage and Analysis (SC '13). | ||||||
| *>  Denver, Colorado, USA, 2013. | *>  Denver, Colorado, USA, 2013. | ||||||
|  | @ -210,16 +214,16 @@ | ||||||
| *>  http://doi.acm.org/10.1145/2503210.2503292 | *>  http://doi.acm.org/10.1145/2503210.2503292 | ||||||
| *> | *> | ||||||
| *>  A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra. | *>  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. | *>  calculations based on fine-grained memory aware tasks. | ||||||
| *>  International Journal of High Performance Computing Applications. | *>  International Journal of High Performance Computing Applications. | ||||||
| *>  Volume 28 Issue 2, Pages 196-209, May 2014. | *>  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 | *> \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 ) |      $                          HOUS2, LHOUS2, WORK, LWORK, INFO ) | ||||||
| * | * | ||||||
|       IMPLICIT NONE |       IMPLICIT NONE | ||||||
|  | @ -265,10 +269,13 @@ | ||||||
| * | * | ||||||
|       KD     = ILAENV2STAGE( 1, 'SSYTRD_2STAGE', VECT, N, -1, -1, -1 ) |       KD     = ILAENV2STAGE( 1, 'SSYTRD_2STAGE', VECT, N, -1, -1, -1 ) | ||||||
|       IB     = ILAENV2STAGE( 2, 'SSYTRD_2STAGE', VECT, N, KD, -1, -1 ) |       IB     = ILAENV2STAGE( 2, 'SSYTRD_2STAGE', VECT, N, KD, -1, -1 ) | ||||||
|       LHMIN  = ILAENV2STAGE( 3, 'SSYTRD_2STAGE', VECT, N, KD, IB, -1 ) |       IF( N.EQ.0 ) THEN | ||||||
|       LWMIN  = ILAENV2STAGE( 4, 'SSYTRD_2STAGE', VECT, N, KD, IB, -1 ) |          LHMIN = 1 | ||||||
| *      WRITE(*,*),'SSYTRD_2STAGE N KD UPLO LHMIN LWMIN ',N, KD, UPLO, |          LWMIN = 1 | ||||||
| *     $            LHMIN, LWMIN |       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 |       IF( .NOT.LSAME( VECT, 'N' ) ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|  | @ -309,14 +316,14 @@ | ||||||
|       LWRK  = LWORK-LDAB*N |       LWRK  = LWORK-LDAB*N | ||||||
|       ABPOS = 1 |       ABPOS = 1 | ||||||
|       WPOS  = ABPOS + LDAB*N |       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 ) |      $                   TAU, WORK( WPOS ), LWRK, INFO ) | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|          CALL XERBLA( 'SSYTRD_SY2SB', -INFO ) |          CALL XERBLA( 'SSYTRD_SY2SB', -INFO ) | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
|       CALL SSYTRD_SB2ST( 'Y', VECT, UPLO, N, KD,  |       CALL SSYTRD_SB2ST( 'Y', VECT, UPLO, N, KD, | ||||||
|      $                   WORK( ABPOS ), LDAB, D, E,  |      $                   WORK( ABPOS ), LDAB, D, E, | ||||||
|      $                   HOUS2, LHOUS2, WORK( WPOS ), LWRK, INFO ) |      $                   HOUS2, LHOUS2, WORK( WPOS ), LWRK, INFO ) | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|          CALL XERBLA( 'SSYTRD_SB2ST', -INFO ) |          CALL XERBLA( 'SSYTRD_SB2ST', -INFO ) | ||||||
|  | @ -324,8 +331,7 @@ | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
| * | * | ||||||
|       HOUS2( 1 ) = LHMIN |       WORK( 1 ) = LWMIN | ||||||
|       WORK( 1 )  = LWMIN |  | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SSYTRD_2STAGE | *     End of SSYTRD_2STAGE | ||||||
|  |  | ||||||
|  | @ -124,7 +124,7 @@ | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          WORK is REAL array, dimension (LWORK) | *>          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. | *>          WORK(1) returns the size of LWORK. | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
|  | @ -132,7 +132,9 @@ | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          LWORK is INTEGER | ||||||
| *>          The dimension of the array WORK which should be calculated | *>          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 | *>          If LWORK = -1, then a workspace query is assumed; the routine | ||||||
| *>          only calculates the optimal size of the WORK array, returns | *>          only calculates the optimal size of the WORK array, returns | ||||||
| *>          this value as the first entry of the WORK array, and no error | *>          this value as the first entry of the WORK array, and no error | ||||||
|  | @ -294,8 +296,12 @@ | ||||||
|       INFO   = 0 |       INFO   = 0 | ||||||
|       UPPER  = LSAME( UPLO, 'U' ) |       UPPER  = LSAME( UPLO, 'U' ) | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       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 |       IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|       ELSE IF( N.LT.0 ) THEN |       ELSE IF( N.LT.0 ) THEN | ||||||
|  | @ -314,7 +320,7 @@ | ||||||
|          CALL XERBLA( 'SSYTRD_SY2SB', -INFO ) |          CALL XERBLA( 'SSYTRD_SY2SB', -INFO ) | ||||||
|          RETURN |          RETURN | ||||||
|       ELSE IF( LQUERY ) THEN |       ELSE IF( LQUERY ) THEN | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LWMIN) |          WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -507,7 +513,7 @@ | ||||||
| 
 | 
 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWMIN) |       WORK( 1 ) = SROUNDUP_LWORK( LWMIN ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SSYTRD_SY2SB | *     End of SSYTRD_SY2SB | ||||||
|  |  | ||||||
|  | @ -234,7 +234,7 @@ | ||||||
| * | * | ||||||
|          NB = ILAENV( 1, 'SSYTRF', UPLO, N, -1, -1, -1 ) |          NB = ILAENV( 1, 'SSYTRF', UPLO, N, -1, -1, -1 ) | ||||||
|          LWKOPT = MAX( 1, N*NB ) |          LWKOPT = MAX( 1, N*NB ) | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -353,7 +353,8 @@ | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|    40 CONTINUE |    40 CONTINUE | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) | * | ||||||
|  |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SSYTRF | *     End of SSYTRF | ||||||
|  |  | ||||||
|  | @ -101,8 +101,10 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          LWORK is INTEGER | ||||||
| *>          The length of WORK.  LWORK >= MAX(1,2*N). For optimum performance | *>          The length of WORK. | ||||||
| *>          LWORK >= N*(1+NB), where NB is the optimal blocksize. | *>          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 | *>          If LWORK = -1, then a workspace query is assumed; the routine | ||||||
| *>          only calculates the optimal size of the WORK array, returns | *>          only calculates the optimal size of the WORK array, returns | ||||||
|  | @ -128,7 +130,7 @@ | ||||||
| *> \ingroup hetrf_aa | *> \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 computational routine -- | ||||||
| *  -- LAPACK is a software package provided by Univ. of Tennessee,    -- | *  -- LAPACK is a software package provided by Univ. of Tennessee,    -- | ||||||
|  | @ -142,19 +144,19 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. Array Arguments .. | *     .. Array Arguments .. | ||||||
|       INTEGER            IPIV( * ) |       INTEGER            IPIV( * ) | ||||||
|       REAL   A( LDA, * ), WORK( * ) |       REAL               A( LDA, * ), WORK( * ) | ||||||
| *     .. | *     .. | ||||||
| * | * | ||||||
| *  ===================================================================== | *  ===================================================================== | ||||||
| *     .. Parameters .. | *     .. Parameters .. | ||||||
|       REAL   ZERO, ONE |       REAL               ZERO, ONE | ||||||
|       PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 ) |       PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 ) | ||||||
| * | * | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL            LQUERY, UPPER |       LOGICAL            LQUERY, UPPER | ||||||
|       INTEGER            J, LWKOPT |       INTEGER            J, LWKMIN, LWKOPT | ||||||
|       INTEGER            NB, MJ, NJ, K1, K2, J1, J2, J3, JB |       INTEGER            NB, MJ, NJ, K1, K2, J1, J2, J3, JB | ||||||
|       REAL   ALPHA |       REAL               ALPHA | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|  | @ -180,19 +182,26 @@ | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       UPPER = LSAME( UPLO, 'U' ) |       UPPER = LSAME( UPLO, 'U' ) | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       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 |       IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|       ELSE IF( N.LT.0 ) THEN |       ELSE IF( N.LT.0 ) THEN | ||||||
|          INFO = -2 |          INFO = -2 | ||||||
|       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN |       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN | ||||||
|          INFO = -4 |          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 |          INFO = -7 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.EQ.0 ) THEN |       IF( INFO.EQ.0 ) THEN | ||||||
|          LWKOPT = (NB+1)*N |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |  | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -204,11 +213,11 @@ | ||||||
| * | * | ||||||
| *     Quick return | *     Quick return | ||||||
| * | * | ||||||
|       IF ( N.EQ.0 ) THEN |       IF( N.EQ.0 ) THEN | ||||||
|           RETURN |           RETURN | ||||||
|       ENDIF |       ENDIF | ||||||
|       IPIV( 1 ) = 1 |       IPIV( 1 ) = 1 | ||||||
|       IF ( N.EQ.1 ) THEN |       IF( N.EQ.1 ) THEN | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -458,7 +467,8 @@ | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|    20 CONTINUE |    20 CONTINUE | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) | * | ||||||
|  |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SSYTRF_AA | *     End of SSYTRF_AA | ||||||
|  |  | ||||||
|  | @ -94,7 +94,7 @@ | ||||||
| *> \param[in] LTB | *> \param[in] LTB | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LTB is INTEGER | *>          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. | *>          used to select NB such that LTB >= (3*NB+1)*N. | ||||||
| *> | *> | ||||||
| *>          If LTB = -1, then a workspace query is assumed; the | *>          If LTB = -1, then a workspace query is assumed; the | ||||||
|  | @ -121,14 +121,14 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          WORK is REAL workspace of size LWORK | *>          WORK is REAL workspace of size (MAX(1,LWORK)) | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          LWORK is INTEGER | ||||||
| *>          The size of WORK. LWORK >= N, internally used to select NB | *>          The size of WORK. LWORK >= MAX(1,N), internally used to | ||||||
| *>          such that LWORK >= N*NB. | *>          select NB such that LWORK >= N*NB. | ||||||
| *> | *> | ||||||
| *>          If LWORK = -1, then a workspace query is assumed; the | *>          If LWORK = -1, then a workspace query is assumed; the | ||||||
| *>          routine only calculates the optimal size of the WORK array, | *>          routine only calculates the optimal size of the WORK array, | ||||||
|  | @ -212,9 +212,9 @@ | ||||||
|          INFO = -2 |          INFO = -2 | ||||||
|       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN |       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN | ||||||
|          INFO = -4 |          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 |          INFO = -6 | ||||||
|       ELSE IF ( LWORK .LT. N .AND. .NOT.WQUERY ) THEN |       ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.WQUERY ) THEN | ||||||
|          INFO = -10 |          INFO = -10 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -228,10 +228,10 @@ | ||||||
|       NB = ILAENV( 1, 'SSYTRF_AA_2STAGE', UPLO, N, -1, -1, -1 ) |       NB = ILAENV( 1, 'SSYTRF_AA_2STAGE', UPLO, N, -1, -1, -1 ) | ||||||
|       IF( INFO.EQ.0 ) THEN |       IF( INFO.EQ.0 ) THEN | ||||||
|          IF( TQUERY ) THEN |          IF( TQUERY ) THEN | ||||||
|             TB( 1 ) = (3*NB+1)*N |             TB( 1 ) = SROUNDUP_LWORK( MAX( 1, (3*NB+1)*N ) ) | ||||||
|          END IF |          END IF | ||||||
|          IF( WQUERY ) THEN |          IF( WQUERY ) THEN | ||||||
|             WORK( 1 ) = SROUNDUP_LWORK(N*NB) |             WORK( 1 ) = SROUNDUP_LWORK( MAX( 1, N*NB ) ) | ||||||
|          END IF |          END IF | ||||||
|       END IF |       END IF | ||||||
|       IF( TQUERY .OR. WQUERY ) THEN |       IF( TQUERY .OR. WQUERY ) THEN | ||||||
|  | @ -240,7 +240,7 @@ | ||||||
| * | * | ||||||
| *     Quick return | *     Quick return | ||||||
| * | * | ||||||
|       IF ( N.EQ.0 ) THEN |       IF( N.EQ.0 ) THEN | ||||||
|          RETURN |          RETURN | ||||||
|       ENDIF |       ENDIF | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -177,14 +177,14 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \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. | *>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK. | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          LWORK >= N*NB, where NB is the block size returned | ||||||
| *>          by ILAENV. | *>          by ILAENV. | ||||||
| *> | *> | ||||||
|  | @ -312,7 +312,7 @@ | ||||||
| * | * | ||||||
|          NB = ILAENV( 1, 'SSYTRF_RK', UPLO, N, -1, -1, -1 ) |          NB = ILAENV( 1, 'SSYTRF_RK', UPLO, N, -1, -1, -1 ) | ||||||
|          LWKOPT = MAX( 1, N*NB ) |          LWKOPT = MAX( 1, N*NB ) | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -488,7 +488,7 @@ | ||||||
| * | * | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SSYTRF_RK | *     End of SSYTRF_RK | ||||||
|  |  | ||||||
|  | @ -118,7 +118,7 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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. | *>          LWORK >= N*NB, where NB is the block size returned by ILAENV. | ||||||
| *> | *> | ||||||
| *>          If LWORK = -1, then a workspace query is assumed; the routine | *>          If LWORK = -1, then a workspace query is assumed; the routine | ||||||
|  | @ -260,7 +260,7 @@ | ||||||
| * | * | ||||||
|          NB = ILAENV( 1, 'SSYTRF_ROOK', UPLO, N, -1, -1, -1 ) |          NB = ILAENV( 1, 'SSYTRF_ROOK', UPLO, N, -1, -1, -1 ) | ||||||
|          LWKOPT = MAX( 1, N*NB ) |          LWKOPT = MAX( 1, N*NB ) | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |          WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|  | @ -383,7 +383,8 @@ | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|    40 CONTINUE |    40 CONTINUE | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) | * | ||||||
|  |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SSYTRF_ROOK | *     End of SSYTRF_ROOK | ||||||
|  |  | ||||||
|  | @ -88,16 +88,16 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          WORK is REAL array, dimension (N+NB+1)*(NB+3) | *>          WORK is REAL array, dimension (MAX(1,LWORK)) | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          LWORK is INTEGER | ||||||
| *>          The dimension of the array WORK. | *>          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 | *>          If LWORK = -1, then a workspace query is assumed; the routine | ||||||
| *>           calculates: | *>          calculates: | ||||||
| *>              - the optimal size of the WORK array, returns | *>              - the optimal size of the WORK array, returns | ||||||
| *>          this value as the first entry of the WORK array, | *>          this value as the first entry of the WORK array, | ||||||
| *>              - and no error message related to LWORK is issued by XERBLA. | *>              - and no error message related to LWORK is issued by XERBLA. | ||||||
|  | @ -120,7 +120,7 @@ | ||||||
| *> \author Univ. of Colorado Denver | *> \author Univ. of Colorado Denver | ||||||
| *> \author NAG Ltd. | *> \author NAG Ltd. | ||||||
| * | * | ||||||
| *> \ingroup realSYcomputational | *> \ingroup hetri2 | ||||||
| * | * | ||||||
| *  ===================================================================== | *  ===================================================================== | ||||||
|       SUBROUTINE SSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO ) |       SUBROUTINE SSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO ) | ||||||
|  | @ -147,7 +147,8 @@ | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|       INTEGER            ILAENV |       INTEGER            ILAENV | ||||||
|       EXTERNAL           LSAME, ILAENV |       REAL               SROUNDUP_LWORK | ||||||
|  |       EXTERNAL           LSAME, ILAENV, SROUNDUP_LWORK | ||||||
| *     .. | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           SSYTRI, SSYTRI2X, XERBLA |       EXTERNAL           SSYTRI, SSYTRI2X, XERBLA | ||||||
|  | @ -159,9 +160,13 @@ | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       UPPER = LSAME( UPLO, 'U' ) |       UPPER = LSAME( UPLO, 'U' ) | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       LQUERY = ( LWORK.EQ.-1 ) | ||||||
|  | * | ||||||
| *     Get blocksize | *     Get blocksize | ||||||
|  | * | ||||||
|       NBMAX = ILAENV( 1, 'SSYTRF', UPLO, N, -1, -1, -1 ) |       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 |          MINSIZE = N | ||||||
|       ELSE |       ELSE | ||||||
|          MINSIZE = (N+NBMAX+1)*(NBMAX+3) |          MINSIZE = (N+NBMAX+1)*(NBMAX+3) | ||||||
|  | @ -173,28 +178,29 @@ | ||||||
|          INFO = -2 |          INFO = -2 | ||||||
|       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN |       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN | ||||||
|          INFO = -4 |          INFO = -4 | ||||||
|       ELSE IF (LWORK .LT. MINSIZE .AND. .NOT.LQUERY ) THEN |       ELSE IF( LWORK.LT.MINSIZE .AND. .NOT.LQUERY ) THEN | ||||||
|          INFO = -7 |          INFO = -7 | ||||||
|       END IF |       END IF | ||||||
| * |  | ||||||
| *     Quick return if possible |  | ||||||
| * |  | ||||||
| * | * | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|          CALL XERBLA( 'SSYTRI2', -INFO ) |          CALL XERBLA( 'SSYTRI2', -INFO ) | ||||||
|          RETURN |          RETURN | ||||||
|       ELSE IF( LQUERY ) THEN |       ELSE IF( LQUERY ) THEN | ||||||
|          WORK(1)=MINSIZE |          WORK( 1 ) = SROUNDUP_LWORK( MINSIZE ) | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
|  | * | ||||||
|  | *     Quick return if possible | ||||||
|  | * | ||||||
|       IF( N.EQ.0 ) |       IF( N.EQ.0 ) | ||||||
|      $   RETURN |      $   RETURN | ||||||
| 
 | * | ||||||
|       IF( NBMAX .GE. N ) THEN |       IF( NBMAX.GE.N ) THEN | ||||||
|          CALL SSYTRI( UPLO, N, A, LDA, IPIV, WORK, INFO ) |          CALL SSYTRI( UPLO, N, A, LDA, IPIV, WORK, INFO ) | ||||||
|       ELSE |       ELSE | ||||||
|          CALL SSYTRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO ) |          CALL SSYTRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO ) | ||||||
|       END IF |       END IF | ||||||
|  | * | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
| *     End of SSYTRI2 | *     End of SSYTRI2 | ||||||
|  |  | ||||||
|  | @ -119,16 +119,17 @@ | ||||||
| *> | *> | ||||||
| *> \param[out] WORK | *> \param[out] WORK | ||||||
| *> \verbatim | *> \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. | *>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK. | ||||||
| *> \endverbatim | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *>          the routine only calculates the optimal size of the optimal | ||||||
| *>          size of the WORK array, returns this value as the first | *>          size of the WORK array, returns this value as the first | ||||||
| *>          entry of the WORK array, and no error message related to | *>          entry of the WORK array, and no error message related to | ||||||
|  | @ -209,8 +210,13 @@ | ||||||
| * | * | ||||||
| *     Determine the block size | *     Determine the block size | ||||||
| * | * | ||||||
|       NB = MAX( 1, ILAENV( 1, 'SSYTRI_3', UPLO, N, -1, -1, -1 ) ) |       IF( N.EQ.0 ) THEN | ||||||
|       LWKOPT = ( N+NB+1 ) * ( NB+3 ) |          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 |       IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|  | @ -218,7 +224,7 @@ | ||||||
|          INFO = -2 |          INFO = -2 | ||||||
|       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN |       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN | ||||||
|          INFO = -4 |          INFO = -4 | ||||||
|       ELSE IF ( LWORK .LT. LWKOPT .AND. .NOT.LQUERY ) THEN |       ELSE IF( LWORK.LT.LWKOPT .AND. .NOT.LQUERY ) THEN | ||||||
|          INFO = -8 |          INFO = -8 | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -226,7 +232,6 @@ | ||||||
|          CALL XERBLA( 'SSYTRI_3', -INFO ) |          CALL XERBLA( 'SSYTRI_3', -INFO ) | ||||||
|          RETURN |          RETURN | ||||||
|       ELSE IF( LQUERY ) THEN |       ELSE IF( LQUERY ) THEN | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |  | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
|  | @ -237,7 +242,7 @@ | ||||||
| * | * | ||||||
|       CALL SSYTRI_3X( UPLO, N, A, LDA, E, IPIV, WORK, NB, INFO ) |       CALL SSYTRI_3X( UPLO, N, A, LDA, E, IPIV, WORK, NB, INFO ) | ||||||
| * | * | ||||||
|       WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |       WORK( 1 ) = SROUNDUP_LWORK( LWKOPT ) | ||||||
| * | * | ||||||
|       RETURN |       RETURN | ||||||
| * | * | ||||||
|  |  | ||||||
|  | @ -105,7 +105,13 @@ | ||||||
| *> \param[in] LWORK | *> \param[in] LWORK | ||||||
| *> \verbatim | *> \verbatim | ||||||
| *>          LWORK is INTEGER | *>          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 | *> \endverbatim | ||||||
| *> | *> | ||||||
| *> \param[out] INFO | *> \param[out] INFO | ||||||
|  | @ -141,7 +147,7 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. Array Arguments .. | *     .. Array Arguments .. | ||||||
|       INTEGER            IPIV( * ) |       INTEGER            IPIV( * ) | ||||||
|       REAL   A( LDA, * ), B( LDB, * ), WORK( * ) |       REAL               A( LDA, * ), B( LDB, * ), WORK( * ) | ||||||
| *     .. | *     .. | ||||||
| * | * | ||||||
| *  ===================================================================== | *  ===================================================================== | ||||||
|  | @ -151,24 +157,31 @@ | ||||||
| *     .. | *     .. | ||||||
| *     .. Local Scalars .. | *     .. Local Scalars .. | ||||||
|       LOGICAL            LQUERY, UPPER |       LOGICAL            LQUERY, UPPER | ||||||
|       INTEGER            K, KP, LWKOPT |       INTEGER            K, KP, LWKMIN | ||||||
| *     .. | *     .. | ||||||
| *     .. External Functions .. | *     .. External Functions .. | ||||||
|       LOGICAL            LSAME |       LOGICAL            LSAME | ||||||
|  |       EXTERNAL           LSAME | ||||||
|       REAL               SROUNDUP_LWORK |       REAL               SROUNDUP_LWORK | ||||||
|       EXTERNAL           LSAME, SROUNDUP_LWORK |       EXTERNAL           SROUNDUP_LWORK | ||||||
| *     .. | *     .. | ||||||
| *     .. External Subroutines .. | *     .. External Subroutines .. | ||||||
|       EXTERNAL           SGTSV, SSWAP, SLACPY, STRSM, XERBLA |       EXTERNAL           SGTSV, SSWAP, SLACPY, STRSM, XERBLA | ||||||
| *     .. | *     .. | ||||||
| *     .. Intrinsic Functions .. | *     .. Intrinsic Functions .. | ||||||
|       INTRINSIC          MAX |       INTRINSIC          MIN, MAX | ||||||
| *     .. | *     .. | ||||||
| *     .. Executable Statements .. | *     .. Executable Statements .. | ||||||
| * | * | ||||||
|       INFO = 0 |       INFO = 0 | ||||||
|       UPPER = LSAME( UPLO, 'U' ) |       UPPER = LSAME( UPLO, 'U' ) | ||||||
|       LQUERY = ( LWORK.EQ.-1 ) |       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 |       IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN | ||||||
|          INFO = -1 |          INFO = -1 | ||||||
|       ELSE IF( N.LT.0 ) THEN |       ELSE IF( N.LT.0 ) THEN | ||||||
|  | @ -179,21 +192,20 @@ | ||||||
|          INFO = -5 |          INFO = -5 | ||||||
|       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN |       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN | ||||||
|          INFO = -8 |          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 |          INFO = -10 | ||||||
|       END IF |       END IF | ||||||
|       IF( INFO.NE.0 ) THEN |       IF( INFO.NE.0 ) THEN | ||||||
|          CALL XERBLA( 'SSYTRS_AA', -INFO ) |          CALL XERBLA( 'SSYTRS_AA', -INFO ) | ||||||
|          RETURN |          RETURN | ||||||
|       ELSE IF( LQUERY ) THEN |       ELSE IF( LQUERY ) THEN | ||||||
|          LWKOPT = (3*N-2) |          WORK( 1 ) = SROUNDUP_LWORK( LWKMIN ) | ||||||
|          WORK( 1 ) = SROUNDUP_LWORK(LWKOPT) |  | ||||||
|          RETURN |          RETURN | ||||||
|       END IF |       END IF | ||||||
| * | * | ||||||
| *     Quick return if possible | *     Quick return if possible | ||||||
| * | * | ||||||
|       IF( N.EQ.0 .OR. NRHS.EQ.0 ) |       IF( MIN( N, NRHS ).EQ.0 ) | ||||||
|      $   RETURN |      $   RETURN | ||||||
| * | * | ||||||
|       IF( UPPER ) THEN |       IF( UPPER ) THEN | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue