229 $ D, E, HOUS, LHOUS, WORK, LWORK, INFO )
243 CHARACTER STAGE1, UPLO, VECT
244 INTEGER N, KD, LDAB, LHOUS, LWORK, INFO
247 DOUBLE PRECISION D( * ), E( * )
248 COMPLEX*16 AB( LDAB, * ), HOUS( * ), WORK( * )
254 DOUBLE PRECISION RZERO
256 parameter( rzero = 0.0d+0,
257 $ zero = ( 0.0d+0, 0.0d+0 ),
258 $ one = ( 1.0d+0, 0.0d+0 ) )
261 LOGICAL LQUERY, WANTQ, , AFTERS1
262 INTEGER I, M, K, IB, SWEEPID, MYID, SHIFT, STT, ST,
263 $ ed, stind, edind, blklastind, colpt, thed,
264 $ stepercol, grsiz, thgrsiz, thgrnb, thgrid,
265 $ nbtiles, ttype, tid, nthreads, debug,
266 $ abdpos, abofdpos, dpos, ofdpos, awpos,
267 $ inda, indw, apos, sizea, lda, indv, indtau,
268 $ sizev, sizetau, ldv, lhmin, lwmin
269 DOUBLE PRECISION ABSTMP
276 INTRINSIC min,
max, ceiling, dble, real
281 EXTERNAL lsame, ilaenv2stage
290 afters1 = lsame( stage1,
'Y' )
291 wantq = lsame( vect,
'V' )
292 upper = lsame( uplo,
'U' )
293 lquery = ( lwork.EQ.-1 ) .OR. ( lhous.EQ.-1 )
297 ib = ilaenv2stage( 2,
'ZHETRD_HB2ST', vect, n, kd, -1, -1 )
298 lhmin = ilaenv2stage( 3, '
zhetrd_hb2st', VECT, N, KD, IB, -1 )
299 LWMIN = ILAENV2STAGE( 4, 'zhetrd_hb2st', VECT, N, KD, IB, -1 )
301.NOT..AND..NOT.
IF( AFTERS1 LSAME( STAGE1, 'n
' ) ) THEN
303.NOT.
ELSE IF( LSAME( VECT, 'n
' ) ) THEN
305.NOT..AND..NOT.
ELSE IF( UPPER LSAME( UPLO, 'l
' ) ) THEN
307.LT.
ELSE IF( N0 ) THEN
309.LT.
ELSE IF( KD0 ) THEN
311.LT.
ELSE IF( LDAB(KD+1) ) THEN
313.LT..AND..NOT.
ELSE IF( LHOUSLHMIN LQUERY ) THEN
315.LT..AND..NOT.
ELSE IF( LWORKLWMIN LQUERY ) THEN
327 ELSE IF( LQUERY ) THEN
345 INDV = INDTAU + SIZETAU
362 AWPOS = INDA + KD + 1
378 D( I ) = DBLE( AB( ABDPOS, I ) )
401 D( I ) = DBLE( AB( ABDPOS, I ) )
408 TMP = AB( ABOFDPOS, I+1 )
410 AB( ABOFDPOS, I+1 ) = ABSTMP
412.NE.
IF( ABSTMPRZERO ) THEN
418 $ AB( ABOFDPOS, I+2 ) = AB( ABOFDPOS, I+2 )*TMP
425 TMP = AB( ABOFDPOS, I )
427 AB( ABOFDPOS, I ) = ABSTMP
429.NE.
IF( ABSTMPRZERO ) THEN
435 $ AB( ABOFDPOS, I+1 ) = AB( ABOFDPOS, I+1 )*TMP
453 NBTILES = CEILING( REAL(N)/REAL(KD) )
454 STEPERCOL = CEILING( REAL(SHIFT)/REAL(GRSIZ) )
455 THGRNB = CEILING( REAL(N-1)/REAL(THGRSIZ) )
457 CALL ZLACPY( "A", KD+1, N, AB, LDAB, WORK( APOS ), LDA )
458 CALL ZLASET( "A", KD, N, ZERO, ZERO, WORK( AWPOS ), LDA )
464!$OMP PARALLEL PRIVATE( TID, THGRID, BLKLASTIND )
465!$OMP$ PRIVATE( THED, I, M, K, ST, ED, STT, SWEEPID )
466!$OMP$ PRIVATE( MYID, TTYPE, COLPT, STIND, EDIND )
467!$OMP$ SHARED ( UPLO, WANTQ, INDV, INDTAU, HOUS, WORK)
468!$OMP$ SHARED ( N, KD, IB, NBTILES, LDA, LDV, INDA )
469!$OMP$ SHARED ( STEPERCOL, THGRNB, THGRSIZ, GRSIZ, SHIFT )
475 DO 100 THGRID = 1, THGRNB
476 STT = (THGRID-1)*THGRSIZ+1
477 THED = MIN( (STT + THGRSIZ -1), (N-1))
481 DO 120 M = 1, STEPERCOL
483 DO 130 SWEEPID = ST, ED
485 MYID = (I-SWEEPID)*(STEPERCOL*GRSIZ)
487.EQ.
IF ( MYID1 ) THEN
490 TTYPE = MOD( MYID, 2 ) + 2
493.EQ.
IF( TTYPE2 ) THEN
494 COLPT = (MYID/2)*KD + SWEEPID
499 COLPT = ((MYID+1)/2)*KD + SWEEPID
502.GE..AND.
IF( ( STINDEDIND-1 )
503.EQ.
$ ( EDINDN ) ) THEN
512#if defined(_OPENMP) && _OPENMP >= 201307
514.NE.
IF( TTYPE1 ) THEN
515!$OMP TASK DEPEND(in:WORK(MYID+SHIFT-1))
516!$OMP$ DEPEND(in:WORK(MYID-1))
517!$OMP$ DEPEND(out:WORK(MYID))
518 TID = OMP_GET_THREAD_NUM()
519 CALL ZHB2ST_KERNELS( UPLO, WANTQ, TTYPE,
520 $ STIND, EDIND, SWEEPID, N, KD, IB,
521 $ WORK ( INDA ), LDA,
522 $ HOUS( INDV ), HOUS( INDTAU ), LDV,
523 $ WORK( INDW + TID*KD ) )
526!$OMP TASK DEPEND(in:WORK(MYID+SHIFT-1))
527!$OMP$ DEPEND(out:WORK(MYID))
528 TID = OMP_GET_THREAD_NUM()
529 CALL ZHB2ST_KERNELS( UPLO, WANTQ, TTYPE,
530 $ STIND, EDIND, SWEEPID, N, KD, IB,
531 $ WORK ( INDA ), LDA,
532 $ HOUS( INDV ), HOUS( INDTAU ), LDV,
533 $ WORK( INDW + TID*KD ) )
537 CALL ZHB2ST_KERNELS( UPLO, WANTQ, TTYPE,
538 $ STIND, EDIND, SWEEPID, N, KD, IB,
539 $ WORK ( INDA ), LDA,
540 $ HOUS( INDV ), HOUS( INDTAU ), LDV,
541 $ WORK( INDW + TID*KD ) )
543.GE.
IF ( BLKLASTIND(N-1) ) THEN
562 D( I ) = DBLE( WORK( DPOS+(I-1)*LDA ) )
570 E( I ) = DBLE( WORK( OFDPOS+I*LDA ) )
574 E( I ) = DBLE( WORK( OFDPOS+(I-1)*LDA ) )
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(uplo, m, n, alpha, beta, a, lda)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zhetrd_hb2st(stage1, vect, uplo, n, kd, ab, ldab, d, e, hous, lhous, work, lwork, info)
ZHETRD_HB2ST reduces a complex Hermitian band matrix A to real symmetric tridiagonal form T
subroutine zhb2st_kernels(uplo, wantz, ttype, st, ed, sweep, n, nb, ib, a, lda, v, tau, ldvt, work)
ZHB2ST_KERNELS