version 1.1, 2017/06/17 11:02:53
|
version 1.6, 2023/08/07 08:39:20
|
Line 1
|
Line 1
|
|
*> \brief \b ZGETSLS |
|
* |
* Definition: |
* Definition: |
* =========== |
* =========== |
* |
* |
Line 53
|
Line 55
|
*> \verbatim |
*> \verbatim |
*> TRANS is CHARACTER*1 |
*> TRANS is CHARACTER*1 |
*> = 'N': the linear system involves A; |
*> = 'N': the linear system involves A; |
*> = 'C': the linear system involves A**C. |
*> = 'C': the linear system involves A**H. |
*> \endverbatim |
*> \endverbatim |
*> |
*> |
*> \param[in] M |
*> \param[in] M |
Line 152
|
Line 154
|
*> \author Univ. of Colorado Denver |
*> \author Univ. of Colorado Denver |
*> \author NAG Ltd. |
*> \author NAG Ltd. |
* |
* |
*> \date December 2016 |
|
* |
|
*> \ingroup complex16GEsolve |
*> \ingroup complex16GEsolve |
* |
* |
* ===================================================================== |
* ===================================================================== |
SUBROUTINE ZGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB, |
SUBROUTINE ZGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB, |
$ WORK, LWORK, INFO ) |
$ WORK, LWORK, INFO ) |
* |
* |
* -- LAPACK driver routine (version 3.7.0) -- |
* -- LAPACK driver 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..-- |
* December 2016 |
|
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
CHARACTER TRANS |
CHARACTER TRANS |
Line 184
|
Line 183
|
* .. |
* .. |
* .. Local Scalars .. |
* .. Local Scalars .. |
LOGICAL LQUERY, TRAN |
LOGICAL LQUERY, TRAN |
INTEGER I, IASCL, IBSCL, J, MINMN, MAXMN, BROW, |
INTEGER I, IASCL, IBSCL, J, MAXMN, BROW, |
$ SCLLEN, MNK, TSZO, TSZM, LWO, LWM, LW1, LW2, |
$ SCLLEN, TSZO, TSZM, LWO, LWM, LW1, LW2, |
$ WSIZEO, WSIZEM, INFO2 |
$ WSIZEO, WSIZEM, INFO2 |
DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM |
DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM, DUM( 1 ) |
COMPLEX*16 TQ( 5 ), WORKQ |
COMPLEX*16 TQ( 5 ), WORKQ( 1 ) |
* .. |
* .. |
* .. External Functions .. |
* .. External Functions .. |
LOGICAL LSAME |
LOGICAL LSAME |
INTEGER ILAENV |
|
DOUBLE PRECISION DLAMCH, ZLANGE |
DOUBLE PRECISION DLAMCH, ZLANGE |
EXTERNAL LSAME, ILAENV, DLABAD, DLAMCH, ZLANGE |
EXTERNAL LSAME, DLABAD, DLAMCH, ZLANGE |
* .. |
* .. |
* .. External Subroutines .. |
* .. External Subroutines .. |
EXTERNAL ZGEQR, ZGEMQR, ZLASCL, ZLASET, |
EXTERNAL ZGEQR, ZGEMQR, ZLASCL, ZLASET, |
Line 208
|
Line 206
|
* Test the input arguments. |
* Test the input arguments. |
* |
* |
INFO = 0 |
INFO = 0 |
MINMN = MIN( M, N ) |
|
MAXMN = MAX( M, N ) |
MAXMN = MAX( M, N ) |
MNK = MAX( MINMN, NRHS ) |
|
TRAN = LSAME( TRANS, 'C' ) |
TRAN = LSAME( TRANS, 'C' ) |
* |
* |
LQUERY = ( LWORK.EQ.-1 .OR. LWORK.EQ.-2 ) |
LQUERY = ( LWORK.EQ.-1 .OR. LWORK.EQ.-2 ) |
Line 231
|
Line 227
|
* |
* |
IF( INFO.EQ.0 ) THEN |
IF( INFO.EQ.0 ) THEN |
* |
* |
* Determine the block size and minimum LWORK |
* Determine the optimum and minimum LWORK |
* |
* |
IF( M.GE.N ) THEN |
IF( M.GE.N ) THEN |
CALL ZGEQR( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 ) |
CALL ZGEQR( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 ) |
TSZO = INT( TQ( 1 ) ) |
TSZO = INT( TQ( 1 ) ) |
LWO = INT( WORKQ ) |
LWO = INT( WORKQ( 1 ) ) |
CALL ZGEMQR( 'L', TRANS, M, NRHS, N, A, LDA, TQ, |
CALL ZGEMQR( 'L', TRANS, M, NRHS, N, A, LDA, TQ, |
$ TSZO, B, LDB, WORKQ, -1, INFO2 ) |
$ TSZO, B, LDB, WORKQ, -1, INFO2 ) |
LWO = MAX( LWO, INT( WORKQ ) ) |
LWO = MAX( LWO, INT( WORKQ( 1 ) ) ) |
CALL ZGEQR( M, N, A, LDA, TQ, -2, WORKQ, -2, INFO2 ) |
CALL ZGEQR( M, N, A, LDA, TQ, -2, WORKQ, -2, INFO2 ) |
TSZM = INT( TQ( 1 ) ) |
TSZM = INT( TQ( 1 ) ) |
LWM = INT( WORKQ ) |
LWM = INT( WORKQ( 1 ) ) |
CALL ZGEMQR( 'L', TRANS, M, NRHS, N, A, LDA, TQ, |
CALL ZGEMQR( 'L', TRANS, M, NRHS, N, A, LDA, TQ, |
$ TSZM, B, LDB, WORKQ, -1, INFO2 ) |
$ TSZM, B, LDB, WORKQ, -1, INFO2 ) |
LWM = MAX( LWM, INT( WORKQ ) ) |
LWM = MAX( LWM, INT( WORKQ( 1 ) ) ) |
WSIZEO = TSZO + LWO |
WSIZEO = TSZO + LWO |
WSIZEM = TSZM + LWM |
WSIZEM = TSZM + LWM |
ELSE |
ELSE |
CALL ZGELQ( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 ) |
CALL ZGELQ( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 ) |
TSZO = INT( TQ( 1 ) ) |
TSZO = INT( TQ( 1 ) ) |
LWO = INT( WORKQ ) |
LWO = INT( WORKQ( 1 ) ) |
CALL ZGEMLQ( 'L', TRANS, N, NRHS, M, A, LDA, TQ, |
CALL ZGEMLQ( 'L', TRANS, N, NRHS, M, A, LDA, TQ, |
$ TSZO, B, LDB, WORKQ, -1, INFO2 ) |
$ TSZO, B, LDB, WORKQ, -1, INFO2 ) |
LWO = MAX( LWO, INT( WORKQ ) ) |
LWO = MAX( LWO, INT( WORKQ( 1 ) ) ) |
CALL ZGELQ( M, N, A, LDA, TQ, -2, WORKQ, -2, INFO2 ) |
CALL ZGELQ( M, N, A, LDA, TQ, -2, WORKQ, -2, INFO2 ) |
TSZM = INT( TQ( 1 ) ) |
TSZM = INT( TQ( 1 ) ) |
LWM = INT( WORKQ ) |
LWM = INT( WORKQ( 1 ) ) |
CALL ZGEMLQ( 'L', TRANS, N, NRHS, M, A, LDA, TQ, |
CALL ZGEMLQ( 'L', TRANS, N, NRHS, M, A, LDA, TQ, |
$ TSZO, B, LDB, WORKQ, -1, INFO2 ) |
$ TSZM, B, LDB, WORKQ, -1, INFO2 ) |
LWM = MAX( LWM, INT( WORKQ ) ) |
LWM = MAX( LWM, INT( WORKQ( 1 ) ) ) |
WSIZEO = TSZO + LWO |
WSIZEO = TSZO + LWO |
WSIZEM = TSZM + LWM |
WSIZEM = TSZM + LWM |
END IF |
END IF |
Line 269
|
Line 265
|
INFO = -10 |
INFO = -10 |
END IF |
END IF |
* |
* |
|
WORK( 1 ) = DBLE( WSIZEO ) |
|
* |
END IF |
END IF |
* |
* |
IF( INFO.NE.0 ) THEN |
IF( INFO.NE.0 ) THEN |
CALL XERBLA( 'ZGETSLS', -INFO ) |
CALL XERBLA( 'ZGETSLS', -INFO ) |
WORK( 1 ) = DBLE( WSIZEO ) |
|
RETURN |
RETURN |
END IF |
END IF |
IF( LQUERY ) THEN |
IF( LQUERY ) THEN |
IF( LWORK.EQ.-1 ) WORK( 1 ) = REAL( WSIZEO ) |
IF( LWORK.EQ.-2 ) WORK( 1 ) = DBLE( WSIZEM ) |
IF( LWORK.EQ.-2 ) WORK( 1 ) = REAL( WSIZEM ) |
|
RETURN |
RETURN |
END IF |
END IF |
IF( LWORK.LT.WSIZEO ) THEN |
IF( LWORK.LT.WSIZEO ) THEN |
Line 305
|
Line 301
|
* |
* |
* Scale A, B if max element outside range [SMLNUM,BIGNUM] |
* Scale A, B if max element outside range [SMLNUM,BIGNUM] |
* |
* |
ANRM = ZLANGE( 'M', M, N, A, LDA, WORK ) |
ANRM = ZLANGE( 'M', M, N, A, LDA, DUM ) |
IASCL = 0 |
IASCL = 0 |
IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN |
IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN |
* |
* |
Line 331
|
Line 327
|
IF ( TRAN ) THEN |
IF ( TRAN ) THEN |
BROW = N |
BROW = N |
END IF |
END IF |
BNRM = ZLANGE( 'M', BROW, NRHS, B, LDB, WORK ) |
BNRM = ZLANGE( 'M', BROW, NRHS, B, LDB, DUM ) |
IBSCL = 0 |
IBSCL = 0 |
IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN |
IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN |
* |
* |