230 RECURSIVE SUBROUTINE zlaqz2( ILSCHUR, ILQ, ILZ, N, ILO, IHI, NW,
231 $ A, LDA, B, LDB, Q, LDQ, Z, LDZ, NS,
232 $ ND, ALPHA, BETA, QC, LDQC, ZC, LDZC,
233 $ WORK, LWORK, RWORK, REC, INFO )
237 LOGICAL,
INTENT( IN ) :: ilschur, ilq, ilz
238 INTEGER,
INTENT( IN ) :: n, ilo, ihi, nw, lda, ldb, ldq, ldz,
241 COMPLEX*16,
INTENT( INOUT ) :: ( lda, * ), b( ldb, * ), q( ldq,
242 $ * ), z( ldz, * ),
alpha( * ), beta( * )
243 INTEGER,
INTENT( OUT ) :: , , info
244 COMPLEX*16 :: qc( ldqc, * ), ( ldzc, * ), work( * )
245 DOUBLE PRECISION :: rwork( * )
248 COMPLEX*16 czero, cone
249 PARAMETER ( czero = ( 0.0d+0, 0.0d+0 ), cone = ( 1.0d+0,
251 DOUBLE PRECISION :: zero, one, half
252 parameter( zero = 0.0d0, one = 1.0d0, half = 0.5d0 )
255 INTEGER :: jw, kwtop, kwbot, istopm, istartm, k, k2, ztgexc_info,
256 $ ifst, ilst, lworkreq, qz_small_info
257 DOUBLE PRECISION ::smlnum, ulp, safmin, safmax, c1, tempr
258 COMPLEX*16 :: s, s1, temp
263 DOUBLE PRECISION,
EXTERNAL ::
dlamch
268 jw =
min( nw, ihi-ilo+1 )
270 IF ( kwtop .EQ. ilo )
THEN
273 s = a( kwtop, kwtop-1 )
279 CALL zlaqz0(
'S',
'V',
'V', jw, 1, jw, a( kwtop, kwtop ), lda,
280 $ b( kwtop, kwtop ), ldb,
alpha, beta, qc, ldqc, zc,
281 $ ldzc, work, -1, rwork, rec+1, qz_small_info )
282 lworkreq = int( work( 1 ) )+2*jw**2
283 lworkreq =
max( lworkreq, n*nw, 2*nw**2+n )
284 IF ( lwork .EQ.-1 )
THEN
288 ELSE IF ( lwork .LT. lworkreq )
THEN
293 CALL xerbla(
'ZLAQZ2', -info )
298 safmin =
dlamch(
'SAFE MINIMUM' )
300 CALL dlabad( safmin, safmax )
301 ulp =
dlamch(
'PRECISION' )
302 smlnum = safmin*( dble( n )/ulp )
304 IF ( ihi .EQ. kwtop )
THEN
306 alpha( kwtop ) = a( kwtop, kwtop )
307 beta( kwtop ) = b( kwtop, kwtop )
310 IF ( abs( s ) .LE.
max( smlnum, ulp*abs( a( kwtop,
314 IF ( kwtop .GT. ilo )
THEN
315 a( kwtop, kwtop-1 ) = czero
322 CALL zlacpy(
'ALL', jw, jw, a( kwtop, kwtop ), lda, work, jw )
323 CALL zlacpy(
'ALL', jw, jw, b( kwtop, kwtop ), ldb, work( jw**2+
327 CALL zlaset( 'full
', JW, JW, CZERO, CONE, QC, LDQC )
328 CALL ZLASET( 'full
', JW, JW, CZERO, CONE, ZC, LDZC )
329 CALL ZLAQZ0( 's
', 'v
', 'v
', JW, 1, JW, A( KWTOP, KWTOP ), LDA,
330 $ B( KWTOP, KWTOP ), LDB, ALPHA, BETA, QC, LDQC, ZC,
331 $ LDZC, WORK( 2*JW**2+1 ), LWORK-2*JW**2, RWORK,
332 $ REC+1, QZ_SMALL_INFO )
334.NE.
IF( QZ_SMALL_INFO 0 ) THEN
337 NS = JW-QZ_SMALL_INFO
338 CALL ZLACPY( 'all
', JW, JW, WORK, JW, A( KWTOP, KWTOP ), LDA )
339 CALL ZLACPY( 'all
', JW, JW, WORK( JW**2+1 ), JW, B( KWTOP,
345.EQ..OR..EQ.
IF ( KWTOP ILO S CZERO ) THEN
351.LE.
DO WHILE ( K JW )
353 TEMPR = ABS( A( KWBOT, KWBOT ) )
354.EQ.
IF( TEMPR ZERO ) THEN
357.LE.
IF ( ( ABS( S*QC( 1, KWBOT-KWTOP+1 ) ) ) MAX( ULP*
358 $ TEMPR, SMLNUM ) ) THEN
365 CALL ZTGEXC( .TRUE., .TRUE., JW, A( KWTOP, KWTOP ),
366 $ LDA, B( KWTOP, KWTOP ), LDB, QC, LDQC,
367 $ ZC, LDZC, IFST, ILST, ZTGEXC_INFO )
379.LE.
DO WHILE ( K IHI )
380 ALPHA( K ) = A( K, K )
381 BETA( K ) = B( K, K )
385.NE..AND..NE.
IF ( KWTOP ILO S CZERO ) THEN
387 A( KWTOP:KWBOT, KWTOP-1 ) = A( KWTOP, KWTOP-1 ) *DCONJG( QC( 1,
389 DO K = KWBOT-1, KWTOP, -1
390 CALL ZLARTG( A( K, KWTOP-1 ), A( K+1, KWTOP-1 ), C1, S1,
392 A( K, KWTOP-1 ) = TEMP
393 A( K+1, KWTOP-1 ) = CZERO
394 K2 = MAX( KWTOP, K-1 )
395 CALL ZROT( IHI-K2+1, A( K, K2 ), LDA, A( K+1, K2 ), LDA, C1,
397 CALL ZROT( IHI-( K-1 )+1, B( K, K-1 ), LDB, B( K+1, K-1 ),
399 CALL ZROT( JW, QC( 1, K-KWTOP+1 ), 1, QC( 1, K+1-KWTOP+1 ),
400 $ 1, C1, DCONJG( S1 ) )
407.GE.
DO WHILE ( K KWTOP )
411 CALL ZLAQZ1( .TRUE., .TRUE., K2, KWTOP, KWTOP+JW-1,
412 $ KWBOT, A, LDA, B, LDB, JW, KWTOP, QC, LDQC,
413 $ JW, KWTOP, ZC, LDZC )
430 IF ( ISTOPM-IHI > 0 ) THEN
431 CALL ZGEMM( 'c
', 'n
', JW, ISTOPM-IHI, JW, CONE, QC, LDQC,
432 $ A( KWTOP, IHI+1 ), LDA, CZERO, WORK, JW )
433 CALL ZLACPY( 'all
', JW, ISTOPM-IHI, WORK, JW, A( KWTOP,
435 CALL ZGEMM( 'c
', 'n
', JW, ISTOPM-IHI, JW, CONE, QC, LDQC,
436 $ B( KWTOP, IHI+1 ), LDB, CZERO, WORK, JW )
437 CALL ZLACPY( 'all
', JW, ISTOPM-IHI, WORK, JW, B( KWTOP,
441 CALL ZGEMM( 'n
', 'n
', N, JW, JW, CONE, Q( 1, KWTOP ), LDQ, QC,
442 $ LDQC, CZERO, WORK, N )
443 CALL ZLACPY( 'all
', N, JW, WORK, N, Q( 1, KWTOP ), LDQ )
446 IF ( KWTOP-1-ISTARTM+1 > 0 ) THEN
447 CALL ZGEMM( 'n
', 'n
', KWTOP-ISTARTM, JW, JW, CONE, A( ISTARTM,
448 $ KWTOP ), LDA, ZC, LDZC, CZERO, WORK,
450 CALL ZLACPY( 'all
', KWTOP-ISTARTM, JW, WORK, KWTOP-ISTARTM,
451 $ A( ISTARTM, KWTOP ), LDA )
452 CALL ZGEMM( 'n
', 'n
', KWTOP-ISTARTM, JW, JW, CONE, B( ISTARTM,
453 $ KWTOP ), LDB, ZC, LDZC, CZERO, WORK,
455 CALL ZLACPY( 'all
', KWTOP-ISTARTM, JW, WORK, KWTOP-ISTARTM,
456 $ B( ISTARTM, KWTOP ), LDB )
459 CALL ZGEMM( 'n
', 'n
', N, JW, JW, CONE, Z( 1, KWTOP ), LDZ, ZC,
460 $ LDZC, CZERO, WORK, N )
461 CALL ZLACPY( 'all
', N, JW, WORK, N, Z( 1, KWTOP ), LDZ )
subroutine zlaqz1(ilq, ilz, k, istartm, istopm, ihi, a, lda, b, ldb, nq, qstart, q, ldq, nz, zstart, z, ldz)
ZLAQZ1
recursive subroutine zlaqz0(wants, wantq, wantz, n, ilo, ihi, a, lda, b, ldb, alpha, beta, q, ldq, z, ldz, work, lwork, rwork, rec, info)
ZLAQZ0
recursive subroutine zlaqz2(ilschur, ilq, ilz, n, ilo, ihi, nw, a, lda, b, ldb, q, ldq, z, ldz, ns, nd, alpha, beta, qc, ldqc, zc, ldzc, work, lwork, rwork, rec, info)
ZLAQZ2
subroutine ztgexc(wantq, wantz, n, a, lda, b, ldb, q, ldq, z, ldz, ifst, ilst, info)
ZTGEXC
subroutine zgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
ZGEMM