203 SUBROUTINE claqz3( ILSCHUR, ILQ, ILZ, N, ILO, IHI, NSHIFTS,
204 $ NBLOCK_DESIRED, ALPHA, BETA, A, LDA, B, LDB,
205 $ Q, LDQ, Z, LDZ, QC, LDQC, ZC, LDZC, WORK,
210 LOGICAL,
INTENT( IN ) :: ILSCHUR, ILQ, ILZ
211 INTEGER,
INTENT( IN ) :: N, ILO, IHI, LDA, LDB, , LDZ, LWORK,
212 $ NSHIFTS, NBLOCK_DESIRED, LDQC, LDZC
214 COMPLEX,
INTENT( INOUT ) :: A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
215 $ ( LDZ, * ), QC( LDQC, * ), ZC( LDZC, * ), WORK( * ),
216 $ ALPHA( * ), BETA( * )
218 INTEGER,
INTENT( OUT ) :: INFO
222 PARAMETER ( CZERO = ( 0.0, 0.0 ), cone = ( 1.0, 0.0 ) )
223 REAL :: ZERO, ONE, HALF
224 parameter( zero = 0.0, one = 1.0, half = 0.5 )
227 INTEGER :: I, J, NS, ISTARTM, ISTOPM, SHEIGHT, SWIDTH, K, NP,
228 $ ISTARTB, ISTOPB, ISHIFT, , NPOS
229 REAL :: SAFMIN, SAFMAX, C, SCALE
230 COMPLEX :: TEMP, TEMP2, TEMP3,
235 REAL,
EXTERNAL :: SLAMCH
238 IF ( nblock_desired .LT. nshifts+1 )
THEN
241 IF ( lwork .EQ.-1 )
THEN
243 work( 1 ) = n*nblock_desired
245 ELSE IF ( lwork .LT. n*nblock_desired )
THEN
250 CALL xerbla(
'CLAQZ3', -info )
259 safmin = slamch(
'SAFE MINIMUM' )
261 CALL slabad( safmin, safmax )
263 IF ( ilo .GE. ihi )
THEN
276 npos =
max( nblock_desired-ns, 1 )
284 CALL claset(
'FULL', ns+1, ns+1, czero, cone, qc, ldqc )
285 CALL claset(
'FULL', ns, ns, czero, cone, zc, ldzc )
289 scale = sqrt( abs( alpha( i ) ) ) * sqrt( abs( beta( i ) ) )
290 IF( scale .GE. safmin .AND. scale .LE. safmax )
THEN
291 alpha( i ) = alpha( i )/scale
292 beta( i ) = beta( i )/scale
295 temp2 = beta( i )*a( ilo, ilo )-alpha( i )*b( ilo, ilo )
296 temp3 = beta( i )*a( ilo+1, ilo )
298 IF ( abs( temp2 ) .GT. safmax .OR.
299 $ abs( temp3 ) .GT. safmax )
THEN
304 CALL clartg( temp2, temp3, c, s, temp )
305 CALL crot( ns, a( ilo, ilo ), lda, a( ilo+1, ilo ), lda, c,
307 CALL crot( ns, b( ilo, ilo ), ldb, b( ilo+1, ilo ), ldb, c,
309 CALL crot( ns+1, qc( 1, 1 ), 1, qc( 1, 2 ), 1, c, conjg(
314 CALL claqz1( .true., .true., j, 1, ns,
315 $ ilo ), lda, b( ilo, ilo ), ldb, ns+1, 1, qc,
316 $ ldqc, ns, 1, zc, ldzc )
327 swidth = istopm-( ilo+ns )+1
328 IF ( swidth > 0 )
THEN
329 CALL cgemm(
'C',
'N', sheight, swidth, sheight, cone, qc, ldqc,
330 $ a( ilo, ilo+ns ), lda, czero, work, sheight )
331 CALL clacpy(
'ALL', sheight, swidth, work, sheight, a( ilo,
333 CALL cgemm(
'C',
'N', sheight, swidth, sheight, cone, qc, ldqc,
334 $ b( ilo, ilo+ns ), ldb, czero, work, sheight )
335 CALL clacpy(
'ALL', sheight, swidth, work, sheight, b( ilo,
339 CALL cgemm(
'N',
'N', n, sheight, sheight, cone, q( 1, ilo ),
340 $ ldq, qc, ldqc, czero, work, n )
341 CALL clacpy(
'ALL', n, sheight, work, n, q( 1, ilo ), ldq )
346 sheight = ilo-1-istartm+1
348 IF ( sheight > 0 )
THEN
349 CALL cgemm(
'N',
'N', sheight, swidth, swidth, cone,
350 $ a( istartm, ilo ), lda, zc, ldzc, czero, work,
352 CALL clacpy(
'ALL', sheight, swidth, work, sheight, a( istartm,
354 CALL cgemm(
'N',
'N', sheight, swidth, swidth, cone,
355 $ b( istartm, ilo ), ldb, zc, ldzc, czero, work,
357 CALL clacpy(
'ALL', sheight, swidth, work, sheight, b( istartm,
361 CALL cgemm(
'N',
'N', n, swidth, swidth, cone, z( 1, ilo ),
362 $ ldz, zc, ldzc, czero, work, n )
363 CALL clacpy(
'ALL', n, swidth, work, n, z( 1, ilo ), ldz )
371 DO WHILE ( k < ihi-ns )
372 np =
min( ihi-ns-k, npos )
380 CALL claset(
'FULL', ns+np, ns+np, czero, cone, qc, ldqc )
381 CALL claset(
'FULL', ns+np, ns+np, czero, cone, zc, ldzc )
389 CALL claqz1( .true., .true., k+i+j, istartb, istopb, ihi,
390 $ a, lda, b, ldb, nblock, k+1, qc, ldqc,
391 $ nblock, k, zc, ldzc )
401 swidth = istopm-( k+ns+np )+1
402 IF ( swidth > 0 )
THEN
403 CALL cgemm(
'C',
'N', sheight, swidth, sheight, cone, qc,
404 $ ldqc, a( k+1, k+ns+np ), lda, czero, work,
406 CALL clacpy(
'ALL', sheight, swidth, work, sheight, a( k+1,
408 CALL cgemm(
'C',
'N', sheight, swidth, sheight, cone, qc,
409 $ ldqc, b( k+1, k+ns+np ), ldb, czero, work,
411 CALL clacpy(
'ALL', sheight, swidth, work, sheight, b( k+1,
415 CALL cgemm(
'N',
'N', n, nblock, nblock, cone, q( 1, k+1 ),
416 $ ldq, qc, ldqc, czero, work, n )
417 CALL clacpy(
'ALL', n, nblock, work, n, q( 1, k+1 ), ldq )
422 sheight = k-istartm+1
424 IF ( sheight > 0 )
THEN
425 CALL cgemm(
'N',
'N', sheight, swidth, swidth, cone,
426 $ a( istartm, k ), lda, zc, ldzc, czero, work,
428 CALL clacpy(
'ALL', sheight, swidth, work, sheight,
429 $ a( istartm, k ), lda )
430 CALL cgemm(
'N',
'N', sheight, swidth, swidth, cone,
431 $ b( istartm, k ), ldb, zc, ldzc, czero, work,
433 CALL clacpy(
'ALL', sheight, swidth, work, sheight,
434 $ b( istartm, k ), ldb )
437 CALL cgemm(
'N',
'N', n, nblock, nblock, cone, z( 1, k ),
438 $ ldz, zc, ldzc, czero, work, n )
439 CALL clacpy(
'ALL', n, nblock, work, n, z( 1, k ), ldz )
449 CALL claset(
'FULL', ns, ns, czero, cone, qc, ldqc )
450 CALL claset(
'FULL', ns+1, ns+1, czero, cone, zc, ldzc )
459 DO ishift = ihi-i, ihi-1
460 CALL claqz1( .true., .true., ishift, istartb, istopb, ihi,
461 $ a, lda, b, ldb, ns, ihi-ns+1, qc, ldqc, ns+1,
472 swidth = istopm-( ihi+1 )+1
473 IF ( swidth > 0 )
THEN
474 CALL cgemm(
'C',
'N', sheight, swidth, sheight, cone, qc, ldqc,
475 $ a( ihi-ns+1, ihi+1 ), lda, czero, work, sheight )
476 CALL clacpy(
'ALL', sheight, swidth, work, sheight,
477 $ a( ihi-ns+1, ihi+1 ), lda )
478 CALL cgemm(
'C',
'N', sheight, swidth, sheight, cone, qc, ldqc,
479 $ b( ihi-ns+1, ihi+1 ), ldb, czero, work, sheight )
480 CALL clacpy(
'ALL', sheight, swidth, work, sheight,
481 $ b( ihi-ns+1, ihi+1 ), ldb )
484 CALL cgemm(
'N',
'N', n, ns, ns, cone, q( 1, ihi-ns+1 ), ldq,
485 $ qc, ldqc, czero, work, n )
486 CALL clacpy(
'ALL', n, ns, work, n, q( 1, ihi-ns+1 ), ldq )
491 sheight = ihi-ns-istartm+1
493 IF ( sheight > 0 )
THEN
494 CALL cgemm(
'N',
'N', sheight, swidth, swidth, cone,
495 $ a( istartm, ihi-ns ), lda, zc, ldzc, czero, work,
497 CALL clacpy(
'ALL', sheight, swidth, work, sheight, a( istartm,
499 CALL cgemm(
'N',
'N', sheight, swidth, swidth, cone,
500 $ b( istartm, ihi-ns ), ldb, zc, ldzc, czero, work,
502 CALL clacpy(
'ALL', sheight, swidth, work, sheight, b( istartm,
506 CALL cgemm( 'n
', 'n
', N, NS+1, NS+1, CONE, Z( 1, IHI-NS ), LDZ,
507 $ ZC, LDZC, CZERO, WORK, N )
508 CALL CLACPY( 'all
', N, NS+1, WORK, N, Z( 1, IHI-NS ), LDZ )