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, LDQ, LDZ, LWORK,
212 $ nshifts, nblock_desired, ldqc, ldzc
214 COMPLEX,
INTENT( INOUT ) :: A( lda, * ), B( ldb, * ), Q( ldq, * ),
215 $ z( 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, nblock, npos
229 REAL :: SAFMIN, SAFMAX, C, SCALE
230 COMPLEX :: TEMP, TEMP2, TEMP3, S
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( s ) )
314 CALL claqz1( .true., .true., j, 1, ns, ihi-ilo+1, a( ilo,
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 )
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine crot(N, CX, INCX, CY, INCY, C, S)
CROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors...
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine claqz3(ILSCHUR, ILQ, ILZ, N, ILO, IHI, NSHIFTS, NBLOCK_DESIRED, ALPHA, BETA, A, LDA, B, LDB, Q, LDQ, Z, LDZ, QC, LDQC, ZC, LDZC, WORK, LWORK, INFO)
CLAQZ3
subroutine claqz1(ILQ, ILZ, K, ISTARTM, ISTOPM, IHI, A, LDA, B, LDB, NQ, QSTART, Q, LDQ, NZ, ZSTART, Z, LDZ)
CLAQZ1