209 SUBROUTINE dlaqz4( ILSCHUR, ILQ, ILZ, N, ILO, IHI, NSHIFTS,
210 $ NBLOCK_DESIRED, SR, SI, SS, A, LDA, B, LDB, Q,
211 $ LDQ, Z, LDZ, QC, LDQC, ZC, LDZC, WORK, LWORK,
216 LOGICAL,
INTENT( IN ) :: ILSCHUR, ILQ, ILZ
217 INTEGER,
INTENT( IN ) :: N, ILO, IHI, LDA, LDB, LDQ, LDZ, LWORK,
218 $ NSHIFTS, NBLOCK_DESIRED, LDQC, LDZC
220 DOUBLE PRECISION,
INTENT( INOUT ) :: A( LDA, * ), B( LDB, * ),
221 $ Q( LDQ, * ), Z( LDZ, * ), QC( LDQC, * ),
222 $ ZC( LDZC, * ), WORK( * ), SR( * ), SI( * ),
225 INTEGER,
INTENT( OUT ) :: INFO
228 DOUBLE PRECISION :: ZERO, , HALF
229 PARAMETER( ZERO = 0.0d0, one = 1.0d0, half = 0.5d0 )
232 INTEGER :: I, J, NS, ISTARTM, ISTOPM, SHEIGHT, SWIDTH, K, NP,
233 $ ISTARTB, ISTOPB, ISHIFT, NBLOCK, NPOS
234 DOUBLE PRECISION :: TEMP, V( 3 ), C1, S1, C2, S2, SWAP
241 IF ( nblock_desired .LT. nshifts+1 )
THEN
244 IF ( lwork .EQ.-1 )
THEN
246 work( 1 ) = n*nblock_desired
248 ELSE IF ( lwork .LT. n*nblock_desired )
THEN
253 CALL xerbla(
'DLAQZ4', -info )
259 IF ( nshifts .LT. 2 )
THEN
263 IF ( ilo .GE. ihi )
THEN
280 DO i = 1, nshifts-2, 2
281 IF( si( i ).NE.-si( i+1 ) )
THEN
285 sr( i+1 ) = sr( i+2 )
290 si( i+1 ) = si( i+2 )
295 ss( i+1 ) = ss( i+2 )
305 ns = nshifts-mod( nshifts, 2 )
306 npos =
max( nblock_desired-ns, 1 )
313 CALL dlaset(
'FULL', ns+1, ns+1, zero, one, qc, ldqc )
314 CALL dlaset(
'FULL', ns, ns, zero, one, zc, ldzc )
318 CALL dlaqz1( a( ilo, ilo ), lda, b( ilo, ilo ), ldb, sr( i ),
319 $ sr( i+1 ), si( i ), ss( i ), ss( i+1 ), v )
322 CALL dlartg( temp, v( 3 ), c1, s1, v( 2 ) )
323 CALL dlartg( v( 1 ), v( 2 ), c2, s2, temp )
325 CALL drot( ns, a( ilo+1, ilo ), lda, a( ilo+2, ilo ), lda, c1,
327 CALL drot( ns, a( ilo, ilo ), lda, a( ilo+1, ilo ), lda, c2,
329 CALL drot( ns, b( ilo+1, ilo ), ldb, b( ilo+2, ilo ), ldb, c1,
331 CALL drot( ns, b( ilo, ilo ), ldb, b( ilo+1, ilo ), ldb, c2,
333 CALL drot( ns+1, qc( 1, 2 ), 1, qc( 1, 3 ), 1, c1, s1 )
334 CALL drot( ns+1, qc( 1, 1 ), 1, qc( 1, 2 ), 1, c2, s2 )
339 CALL dlaqz2( .true., .true., j, 1, ns, ihi-ilo+1, a( ilo,
340 $ ilo ), lda, b( ilo, ilo ), ldb, ns+1, 1, qc,
341 $ ldqc, ns, 1, zc, ldzc )
352 swidth = istopm-( ilo+ns )+1
353 IF ( swidth > 0 )
THEN
354 CALL dgemm(
'T',
'N', sheight, swidth, sheight, one, qc, ldqc,
355 $ a( ilo, ilo+ns ), lda, zero, work, sheight )
356 CALL dlacpy(
'ALL', sheight, swidth, work, sheight, a( ilo,
358 CALL dgemm(
'T',
'N', sheight, swidth, sheight, one, qc, ldqc,
359 $ b( ilo, ilo+ns ), ldb, zero, work, sheight )
360 CALL dlacpy(
'ALL', sheight, swidth, work, sheight, b( ilo,
364 CALL dgemm(
'N',
'N', n, sheight, sheight, one, q( 1, ilo ),
365 $ ldq, qc, ldqc, zero, work, n )
366 CALL dlacpy(
'ALL', n, sheight, work, n, q( 1, ilo ), ldq )
371 sheight = ilo-1-istartm+1
373 IF ( sheight > 0 )
THEN
374 CALL dgemm( 'n
', 'n
', SHEIGHT, SWIDTH, SWIDTH, ONE, A( ISTARTM,
375 $ ILO ), LDA, ZC, LDZC, ZERO, WORK, SHEIGHT )
376 CALL DLACPY( 'all
', SHEIGHT, SWIDTH, WORK, SHEIGHT, A( ISTARTM,
378 CALL DGEMM( 'n
', 'n
', SHEIGHT, SWIDTH, SWIDTH, ONE, B( ISTARTM,
379 $ ILO ), LDB, ZC, LDZC, ZERO, WORK, SHEIGHT )
380 CALL DLACPY( 'all
', SHEIGHT, SWIDTH, WORK, SHEIGHT, B( ISTARTM,
384 CALL DGEMM( 'n
', 'n
', N, SWIDTH, SWIDTH, ONE, Z( 1, ILO ), LDZ,
385 $ ZC, LDZC, ZERO, WORK, N )
386 CALL DLACPY( 'all
', N, SWIDTH, WORK, N, Z( 1, ILO ), LDZ )
394 DO WHILE ( K < IHI-NS )
395 NP = MIN( IHI-NS-K, NPOS )
403 CALL DLASET( 'full
', NS+NP, NS+NP, ZERO, ONE, QC, LDQC )
404 CALL DLASET( 'full
', NS+NP, NS+NP, ZERO, ONE, ZC, LDZC )
412 CALL DLAQZ2( .TRUE., .TRUE., K+I+J-1, ISTARTB, ISTOPB,
413 $ IHI, A, LDA, B, LDB, NBLOCK, K+1, QC, LDQC,
414 $ NBLOCK, K, ZC, LDZC )
424 SWIDTH = ISTOPM-( K+NS+NP )+1
425 IF ( SWIDTH > 0 ) THEN
426 CALL DGEMM( 't
', 'n
', SHEIGHT, SWIDTH, SHEIGHT, ONE, QC,
427 $ LDQC, A( K+1, K+NS+NP ), LDA, ZERO, WORK,
429 CALL DLACPY( 'all
', SHEIGHT, SWIDTH, WORK, SHEIGHT, A( K+1,
431 CALL DGEMM( 't
', 'n
', SHEIGHT, SWIDTH, SHEIGHT, ONE, QC,
432 $ LDQC, B( K+1, K+NS+NP ), LDB, ZERO, WORK,
434 CALL DLACPY( 'all
', SHEIGHT, SWIDTH, WORK, SHEIGHT, B( K+1,
438 CALL DGEMM( 'n
', 'n
', N, NBLOCK, NBLOCK, ONE, Q( 1, K+1 ),
439 $ LDQ, QC, LDQC, ZERO, WORK, N )
440 CALL DLACPY( 'all
', N, NBLOCK, WORK, N, Q( 1, K+1 ), LDQ )
445 SHEIGHT = K-ISTARTM+1
447 IF ( SHEIGHT > 0 ) THEN
448 CALL DGEMM( 'n
', 'n
', SHEIGHT, SWIDTH, SWIDTH, ONE,
449 $ A( ISTARTM, K ), LDA, ZC, LDZC, ZERO, WORK,
451 CALL DLACPY( 'all
', SHEIGHT, SWIDTH, WORK, SHEIGHT,
452 $ A( ISTARTM, K ), LDA )
453 CALL DGEMM( 'n
', 'n
', SHEIGHT, SWIDTH, SWIDTH, ONE,
454 $ B( ISTARTM, K ), LDB, ZC, LDZC, ZERO, WORK,
456 CALL DLACPY( 'all
', SHEIGHT, SWIDTH, WORK, SHEIGHT,
457 $ B( ISTARTM, K ), LDB )
460 CALL DGEMM( 'n
', 'n
', N, NBLOCK, NBLOCK, ONE, Z( 1, K ),
461 $ LDZ, ZC, LDZC, ZERO, WORK, N )
462 CALL DLACPY( 'all
', N, NBLOCK, WORK, N, Z( 1, K ), LDZ )
472 CALL DLASET( 'full
', NS, NS, ZERO, ONE, QC, LDQC )
473 CALL DLASET( 'full
', NS+1, NS+1, ZERO, ONE, ZC, LDZC )
482 DO ISHIFT = IHI-I-1, IHI-2
483 CALL DLAQZ2( .TRUE., .TRUE., ISHIFT, ISTARTB, ISTOPB, IHI,
484 $ A, LDA, B, LDB, NS, IHI-NS+1, QC, LDQC, NS+1,
495 SWIDTH = ISTOPM-( IHI+1 )+1
496 IF ( SWIDTH > 0 ) THEN
497 CALL DGEMM( 't
', 'n
', SHEIGHT, SWIDTH, SHEIGHT, ONE, QC, LDQC,
498 $ A( IHI-NS+1, IHI+1 ), LDA, ZERO, WORK, SHEIGHT )
499 CALL DLACPY( 'all
', SHEIGHT, SWIDTH, WORK, SHEIGHT,
500 $ A( IHI-NS+1, IHI+1 ), LDA )
501 CALL DGEMM( 't
', 'n
', SHEIGHT, SWIDTH, SHEIGHT, ONE, QC, LDQC,
502 $ B( IHI-NS+1, IHI+1 ), LDB, ZERO, WORK, SHEIGHT )
503 CALL DLACPY( 'all
', SHEIGHT, SWIDTH, WORK, SHEIGHT,
504 $ B( IHI-NS+1, IHI+1 ), LDB )
507 CALL DGEMM( 'n
', 'n
', N, NS, NS, ONE, Q( 1, IHI-NS+1 ), LDQ,
508 $ QC, LDQC, ZERO, WORK, N )
509 CALL DLACPY( 'all
', N, NS, WORK, N, Q( 1, IHI-NS+1 ), LDQ )
514 SHEIGHT = IHI-NS-ISTARTM+1
516 IF ( SHEIGHT > 0 ) THEN
517 CALL DGEMM( 'n
', 'n
', SHEIGHT, SWIDTH, SWIDTH, ONE, A( ISTARTM,
518 $ IHI-NS ), LDA, ZC, LDZC, ZERO, WORK, SHEIGHT )
519 CALL DLACPY( 'all
', SHEIGHT, SWIDTH, WORK, SHEIGHT, A( ISTARTM,
521 CALL DGEMM( 'n
', 'n
', SHEIGHT, SWIDTH, SWIDTH, ONE, B( ISTARTM,
522 $ IHI-NS ), LDB, ZC, LDZC, ZERO, WORK, SHEIGHT )
523 CALL DLACPY( 'all
', SHEIGHT, SWIDTH, WORK, SHEIGHT, B( ISTARTM,
527 CALL DGEMM( 'n
', 'n
', N, NS+1, NS+1, ONE, Z( 1, IHI-NS ), LDZ,
528 $ ZC, LDZC, ZERO, WORK, N )
529 CALL DLACPY( 'all
', N, NS+1, WORK, N, Z( 1, IHI-NS ), LDZ )