160 SUBROUTINE zgetsls( TRANS, M, N, NRHS, A, LDA, B, LDB,
161 $ WORK, LWORK, INFO )
169 INTEGER , LDA, , LWORK, M, N, NRHS
172 COMPLEX*16 A( , * ), B( LDB, * ), WORK( * )
179 DOUBLE PRECISION ZERO, ONE
180 parameter( zero = 0.0d0, one = 1.0d0 )
182 parameter( czero = ( 0.0d+0, 0.0d+0 ) )
186 INTEGER I, IASCL, IBSCL, J, MAXMN, BROW,
187 $ scllen, tszo, tszm, lwo, lwm, lw1, lw2,
188 $ wsizeo, wsizem, info2
189 DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM, DUM( 1 )
190 COMPLEX*16 TQ( 5 ), WORKQ( 1 )
194 DOUBLE PRECISION DLAMCH, ZLANGE
195 EXTERNAL lsame,
dlabad, dlamch, zlange
202 INTRINSIC dble,
max,
min, int
210 tran = lsame( trans,
'C' )
212 lquery = ( lwork.EQ.-1 .OR. lwork.EQ.-2 )
213 IF( .NOT.( lsame( trans,
'N' ) .OR.
214 $ lsame( trans,
'C' ) ) )
THEN
216 ELSE IF( m.LT.0 )
THEN
218 ELSE IF( n.LT.0 )
THEN
220 ELSE IF( nrhs.LT.0 )
THEN
222 ELSE IF( lda.LT.
max( 1, m ) )
THEN
224 ELSE IF( ldb.LT.
max( 1, m, n ) )
THEN
233 CALL zgeqr( m, n, a, lda, tq, -1, workq, -1, info2 )
234 tszo = int( tq( 1 ) )
235 lwo = int( workq( 1 ) )
236 CALL zgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
237 $ tszo, b, ldb, workq, -1, info2 )
238 lwo =
max( lwo, int( workq( 1 ) ) )
239 CALL zgeqr( m, n, a, lda, tq, -2, workq, -2, info2 )
240 tszm = int( tq( 1 ) )
241 lwm = int( workq( 1 ) )
242 CALL zgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
243 $ tszm, b, ldb, workq, -1, info2 )
244 lwm =
max( lwm, int( workq( 1 ) ) )
248 CALL zgelq( m, n, a, lda, tq, -1, workq, -1, info2 )
249 tszo = int( tq( 1 ) )
250 lwo = int( workq( 1 ) )
251 CALL zgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
252 $ tszo, b, ldb, workq, -1, info2 )
253 lwo =
max( lwo, int( workq( 1 ) ) )
254 CALL zgelq( m, n, a, lda, tq, -2, workq, -2, info2 )
255 tszm = int( tq( 1 ) )
256 lwm = int( workq( 1 ) )
257 CALL zgemlq( 'l
', TRANS, N, NRHS, M, A, LDA, TQ,
258 $ TSZM, B, LDB, WORKQ, -1, INFO2 )
259 LWM = MAX( LWM, INT( WORKQ( 1 ) ) )
264.LT..AND..NOT.
IF( ( LWORKWSIZEM )( LQUERY ) ) THEN
268 WORK( 1 ) = DBLE( WSIZEO )
273 CALL XERBLA( 'zgetsls', -INFO )
277.EQ.
IF( LWORK-2 ) WORK( 1 ) = DBLE( WSIZEM )
280.LT.
IF( LWORKWSIZEO ) THEN
290.EQ.
IF( MIN( M, N, NRHS )0 ) THEN
291 CALL ZLASET( 'full
', MAX( M, N ), NRHS, CZERO, CZERO,
298 SMLNUM = DLAMCH( 's' ) / dlamch(
'P' )
299 bignum = one / smlnum
300 CALL dlabad( smlnum, bignum )
304 anrm = zlange(
'M', m, n, a, lda, dum )
306 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
310 CALL zlascl(
'G', 0, 0, anrm, smlnum, m
312 ELSE IF( anrm.GT.bignum )
THEN
316 CALL zlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
318 ELSE IF( anrm.EQ.zero )
THEN
322 CALL zlaset(
'F', maxmn, nrhs, czero, czero, b, ldb )
330 bnrm = zlange(
'M', brow, nrhs, b, ldb, dum )
332 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
336 CALL zlascl( 'g
', 0, 0, BNRM, SMLNUM, BROW, NRHS, B, LDB,
339.GT.
ELSE IF( BNRMBIGNUM ) THEN
343 CALL ZLASCL( 'g
', 0, 0, BNRM, BIGNUM, BROW, NRHS, B, LDB,
352 CALL ZGEQR( M, N, A, LDA, WORK( LW2+1 ), LW1,
353 $ WORK( 1 ), LW2, INFO )
354.NOT.
IF ( TRAN ) THEN
360 CALL ZGEMQR( 'l
' , 'c
', M, NRHS, N, A, LDA,
361 $ WORK( LW2+1 ), LW1, B, LDB, WORK( 1 ), LW2,
366 CALL ZTRTRS( 'u
', 'n
', 'n', n, nrhs,
367 $ a, lda, b, ldb, info )
378 CALL ztrtrs(
'U',
'C',
'N', n, nrhs,
379 $ a, lda, b, ldb, info )
395 CALL zgemqr(
'L',
'N', m, nrhs, n, a, lda,
396 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
407 CALL zgelq( m, n, a, lda, work( lw2+1 ), lw1,
408 $ work( 1 ), lw2, info )
418 CALL ztrtrs(
'L',
'N',
'N', m, nrhs,
419 $ a, lda, b, ldb, info )
435 CALL zgemlq(
'L',
'C', n, nrhs, m, a, lda,
436 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
449 CALL zgemlq(
'L',
'N', n, nrhs, m, a, lda,
450 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
457 CALL ztrtrs(
'L',
'C',
'N', m, nrhs,
458 $ a, lda, b, ldb, info )
472 IF( iascl.EQ.1 )
THEN
473 CALL zlascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
475 ELSE IF( iascl.EQ.2 )
THEN
476 CALL zlascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
479 IF( ibscl.EQ.1 )
THEN
480 CALL zlascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
482 ELSE IF( ibscl.EQ.2 )
THEN
483 CALL zlascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
488 work( 1 ) = dble( tszo + lwo )